質問

これは私の最初の投稿であり、約 1 年間断続的に取り組んできたことについて取り上げています。

本質的に、それは次のように要約されます。newlib のコピーがあり、LPC2388 (NXP の ARM7TDMI) で動作させようとしています。これは arm-elf-gcc を使用する Linux ボックス上にあります

私が抱いている質問は、newlib の移植について説明している多くのチュートリアルを見てきましたが、それらはすべてスタブ (exit、open、read/write、sbrk など) について説明しており、かなり良いアイデアを持っているということです。これらすべての機能を実装する方法。しかし どこ 入れるべきですか?

私はsources.redhat.com/pub/newlib/newlib-1.18.0.tar.gzからnewlibディストリビューションを持っており、調べてみたところ「syscalls.c」を見つけました(newlib-1.18.0/newlib/libc/sys/内) arm) には、更新する必要があるすべてのスタブが含まれていますが、それらはすべてかなり完成したように見えるコードで埋められています (これは、 ない crt0.S がなくても動作するようですが、crt0.S 自体は私のチップでは動作しません)。

これらの関数を自分で消去して、書き直す必要があるでしょうか?それとも別の場所に書いたほうがいいでしょうか。newlib/libc/sys に「アーキテクチャ」という名前のまったく新しいフォルダーを作成し、それに合わせてターゲットを変更する必要がありますか?

また、このようなものをオープンソース プロジェクトとしてリリースした後、配布する際の適切なエチケットがあるかどうかも気になります。現在、binutils、arm-elf-gcc、newlib、および gdb をダウンロードしてコンパイルするスクリプトがあります。newlib ディレクトリにあるファイルを変更している場合、スクリプトが自動適用するパッチを渡すべきでしょうか?それとも、変更した newlib をリポジトリに追加する必要がありますか?

わざわざ読んでいただきありがとうございます!これに続いて、私が行っていることのより詳細な内訳を説明します。


私のセットアップに関する詳細情報が必要な方は、次の手順を実行してください。

私は Uzebox プロジェクトに大まかに基づいて ARM ビデオゲーム コンソールを構築しています ( http://belogic.com/uzebox/ ).

私はそれを理解しようとして、さまざまなリソースを活用してあらゆる種類のことを行ってきました。私の冒険の始まりについては、ここで読むことができます (sparkfun フォーラム、私が独自に考え出したため誰も反応しません)。forum.sparkfun.com/viewtopic.php?f=11&t=22072

私は newlib の移植に関する Stackoverflow の質問を読み、さまざまなチュートリアル (wiki.osdev.org/Porting_Newlib など) をいくつか見ましたが、どこで、誰が、何を、いつ、どのようにして!

役に立ちましたか?

解決

でもどこに置けばいいのでしょうか?

最終リンクに存在する限り、好きな場所に配置できます。これらを libc ライブラリ自体に組み込むことも、その汎用性を維持して、syscall を別のターゲット固有のオブジェクト ファイルまたはライブラリとして持つこともできます。

独自のターゲット固有の crt0.s を作成し、それをターゲット用にアセンブルしてリンクする必要がある場合があります。

GNU/ARM 開発の立ち上げと実行に関する Quantum Leaps の Miro Samek による優れたチュートリアルが利用可能です ここ. 。例は Atmel AT91 パーツに基づいているため、スタートアップ コードを適応させるには NXP デバイスについて少し知る必要があります。

LPC2xxx 用の既製の Newlib 移植層 だった 利用可能 ここ, ですが、ファイルのリンクが壊れているようです。同じ移植レイヤーが Martin Thomas のバージョンでも使用されています。 WinARM プロジェクト。これは GNU ARM GCC の Windows ポートですが、これに含まれる例はホスト固有ではなくターゲット固有です。

Newlib の移植層を変更するだけで済みます。これはターゲットであるためです。 そして アプリケーション固有の場合、コードをプロジェクトに送信する必要はありません (実際、おそらく送信すべきではありません)。

他のヒント

newlib を使用していたとき、まさにそれが私が行ったことで、crt0.s、syscalls.c、libcfunc.c を吹き飛ばしました。私の個人的な好みは、組み込みアプリケーションに基づいて crt0.s と syscalls.c の置き換えをリンクすることでした (libcfunc のいくつかの関数を syscalls.c の置き換えに組み込んだ)。

私はその作品をディストリビューションに戻すことにまったく興味がなかったので、そこであなたを助けることはできません。

ただし、正しい道を進んでいます。crt0.S と syscalls.c は、ターゲットに合わせてカスタマイズする作業を行う場所です。個人的に私は C ライブラリ (および printf) に興味があり、主にすべての関数を無効にして 0 または 1、または関数が正常に動作しリンクの邪魔にならないようにするために必要なものを何でも返し、定期的にファイルを作成していました。 /O 関数は、ROM/RAM 内のリンクされたデータに対して動作します。基本的に newlib 内の他のファイルを置き換えたり変更したりすることなく、かなりの成功を収めることができたので、正しい道を進んでいることになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top