問題タブ [newlib]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
llvm - LLVM を使用して標準 C ライブラリをカスタマイズする (llvm バックエンドの最適化をサポートするため)
目的:
ARMアセンブリ/バイナリの出力形式を変更する LLVM バックエンドのパスを実装しました(たとえば、各基本ブロックの最後にジャンプを追加して、フォール スルーを排除します)。次のように呼び出します。
arm gnu linuxで適切に動作する、予想されるarmアセンブリ/バイナリを生成します(qemu-armとgem5を使用してシミュレートします)。今度は標準の c ライブラリで同じことをしたいのですが、ここに問題があります。
問題:
によると:
llvm を使用して glibc をコンパイルすることは、適切なオプションではない可能性があります。一方、次のように述べています。
llvm は newlib をコンパイルできる可能性があるため、人々は newlib を代替手段と考えています。ただし、次のとおりです。
newlib は、ベア メタル (OS なし) ソフトウェアのバイナリをサポートする予定です。ハードウェアに依存しない部分 (libc や libm など) のみを実装し、ハードウェアに依存するシステムコールごとにスタブを残します (libgloss のすべてなど)。
実際、「--with-newlib」オプションで構成されたarm-none-eabi-gccを使用して単純な「hello world」Cプログラムをコンパイルしようとしましたが、プログラムの実行はqemu-armとgem5の両方でセグメンテーション違反で終了します.
質問:
newlib が glibc と互換性があるかどうかはわかりません。llvm を使用して、newlib からマシンに依存しない部分をクロスコンパイルし (同時にアームの出力形式を変更)、arm-none-linux-gnueabi-gcc を使用してマシンに依存する部分をクロスコンパイルできるかどうか疑問に思っています。 glibc を作成し、これら 2 つの部分を組み合わせて独自の標準 C ライブラリを生成しますか?
私の仕事には間違いや誤解があるかもしれません。私の変更を標準の c ライブラリの少なくとも一部に追加し、プログラムを qemu-arm または gem5 で実行できる他の方法はありますか?
c - newlib-nano に切り替えるとアプリケーションの実行が停止する
Cortex-M4 プラットフォームで正常に動作する newlib 4.9.3 2014q4 アプリケーションがあります。シリアル コンソールへのすべての出力は、iprintf
またはカスタムsend_str
関数のいずれかを使用します。はsend_str
、シリアル ペリフェラル tx バッファーにバイトを書き込むだけです ( my へのループ呼び出しfputc
)。
アプリケーションのメイン (データ再配置の初期化と bss zero'ing の後) で、バナーを出力します。newlib-nano( --specs=nano.specs
) を使用する場合、 を使用すると機能しますsend_str
が、 を使用すると機能しませんiprintf
。
対
(nanoではなく)newlibだけを使用すると、両方の機能が機能します。
私がこれまで読んできたものはすべて、この 2 つを交換するためにアプリケーションを変更する必要はないことを示唆しています。これに例外はありますか?
gcc - GCC for ARM が余分なデータをリンクしている
現在、Cortex-M0+ マイクロコントローラーである LPC810 にコードをアップロードしようとしています。私が使用しようとしている単純なプログラムがあります。これは、LED を点滅させるだけです。
編集:このファイルはmain.c
.
私はこのコードを書いていませんが、動作することは知っています。問題は、これをバイナリ ファイルにコンパイルしてアップロードすると、75 kiB 程度になることです。私のマイクロコントローラには大きすぎます。
elf ファイルで実行size
した後、余分な関数とデータがリンクされているようです。私は newlib を使用しています。
以下は私のMakefileです。おそらくコンパイル/リンクフラグに関係していると確信していますが、それを理解することができませんでした。
これで16進拡張子のバイナリファイルを生成しているので、混乱してすみません。
これを修正する方法について何か考えはありますか?助けてくれてありがとう!
c - newlib を介して渡される GDB デバッグ引数
TI CC2538 ARM Cortex M3 パーツで newlib を使用しようとしています。目的は、メッセージのデバッグに printf を使用することであり、実際に機能しています。ただし、システムはいくつかのメッセージの後にセグメンテーション違反を起こし (ARM はそれを HardFault と呼びます)、その理由はわかりません。
GDB を使用して、次のスタック トレースを取得しました。
ご覧のとおり、newlib の部分 (#2 ~ #5) には情報がなく、デバッグが困難になっています。これは、newlib からデバッグ シンボルが取り除かれたためだと思いますが、newlib を再コンパイルしたところ、同じ結果が得られました。
公式リポジトリで利用可能なツールチェーンを使用して Arch Linux を実行しています。
-
Arch Build System (ABS) を使用して手動で newlib パッケージをビルドしましたが、デバッグ シンボルを含める必要があると思います (関数名は GDB に表示されます。それで十分ですか?)
次に試すことができるアイデアはありますか?
編集
障害ステータス レジスタが実際に読み取れるように、出力を修正しました。
デコードされた出力は次のとおりです。
これを解釈すると、問題のある命令のアドレスが FAULTADDR に格納されているバス障害例外が発生しました。CPU が 0xffffff8 を呼び出そうとした原因はわかりませんが、それが問題の原因であると確信しています。
c - Newlib で write()、_write()、または _write_r() を実装しますか?
printf()
標準 C ライブラリに Newlib を使用する ARM GCC ツールチェーン環境で、STM32F411RET マイクロコントローラの関数を再ターゲットしようとしています。
をリターゲットする方法を検索するとprintf()
、多くの人が実装する必要があると言い_write()
ます_write_r()
。そして、それは両方とも機能しているようです。
しかし、私はまだそれらについて質問があります:
Newlibのドキュメントを見ると、出力ファイルに実装できると書かれ
write()
ていますが、機能していないようです。実装できるように見えます_write()
が、この機能はドキュメントには記載されていません。どうしたのwrite()
?アンダースコアは何か違うのですか?_write_r()
よりも好ましい状況は_wirte()
どれですか?C の再入力の概念がわかりません。例はありますか?
これを読んでくれてありがとう。