問題タブ [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.
glibc - snprintf() の C ソースコードを探しています
GLibC を完全にはサポートしていない別のプラットフォームに snprintf() を移植する必要があります。
Glibc 2.14 ソース コードの基になる宣言を探しています。多くの関数呼び出しに従いますが、vfprintf() でスタックします。その後、_IO_vfprintf() を呼び出しているようですが、定義が見つかりません。おそらくマクロが物事を難読化しています。
フォーマット文字列をスキャンし、入力バッファが十分に大きい場合に書き込むバイト数を計算する実際の C コードを確認する必要があります。
newlib 1.19.0 も調べてみましたが、_svfprintf_r() で行き詰まりました。どこにも定義が見つかりません。
snprintf() の定義または別の定義を教えてもらえますか?
c - 「一部のmath.hのみ」関数への未定義の参照
奇妙な問題があります。
数学ライブラリが私のmakefileに追加されました。
出力ファイル(.map)で、すべてが正しくリンクされていることがわかります。
私がする時
それはうまくいきます。しかし、次のような別の関数をテストすると、次のようになります。
私は得るでしょう:
どうすればいいの?powとasinの両方がmath.hで利用可能です。以下を参照してください。
一方が機能し、もう一方がリンカーの問題を生成するにはどうすればよいですか?libm.aで-nm を実行すると、次の結果が得られます:(膨大な出力で申し訳ありませんが、sinという単語のセクションのみをコピーしました)
編集1: 私はもう少しテストしました、そして問題は次の通りです(私が最初に上で述べたものではありません):
ビルドしようとすると、最後の行に「未定義の参照」が表示されます。つまり、定数を使用すると問題ありませんが、変数をsin関数に渡すとリンクされません。他の数学関数の多くもテストしましたが、まったく同じリンカーの問題が発生します。変数を数学関数に渡すとすぐに、リンクできなくなります。何か案は?
embedded - printfを使用してfloat/doubleを印刷すると、プログラムがクラッシュします
私はPowerPcのシステムコールの実装に取り組んでいます。私はいくつかのgcc関数をテストしましたが、それらはすべて機能しているようです(たとえば、sqrt sin cos pow printf malloc ...)
最近、printfに問題があることに気づきました。integer / charを出力する限りは正常に機能しますが、f%f /lfを印刷してfloat/doubleを出力しようとすると、プログラムがクラッシュします。(実行されるべきではない場所で実行されているようです)
私はmakefileをチェックしました、それは使用します:
プログラムを作成すると、多くのnof(フロートなし)ライブラリがリンクされているのを見ることができます。
また、スタック/ヒープに十分なスペースがあるので、問題がないこともわかっています。 floatを印刷するときにprintfがクラッシュする理由はまだありますか?
arm - newlibとのリンク:memcpyへの未定義の参照
私はarmブートローダーを構築しようとしていますが、いくつかのシステムコール(memcpyなど)を提供するためにnewlibに依存しています。
私が走るとき:
私は次のようになります:
今のところ、私はmemcpyを攻撃しており、他の人がフォローすることを望んでいます。私が実行するとnm /usr/arm-elf/lib/thumb/libc.a
(これはlibcのnewlibバージョンであると私は信じています)、次のように表示されます。
つまり、これはmemcpyがライブラリで定義されていることを示しています。
上記のコマンドを実行strace
して、実際にそのファイルを参照していることを確認しました。実際、実際に確認しています。ld
ここで何が欠けていますか?未定義のmemcpyについて不平を言うのはなぜですか?
porting - newlib 関数でのページ フォールト
私は非常に小さなカーネルに newlib を移植してきましたが、困惑しています。システム コールを参照する関数を含めると、私のプログラムは実行時にページ フォールトを起こします。のように、システム コールを参照しない関数を呼び出してもrand()
、何も問題はありません。
printf()
注: 含めるとは、 or などの関数が、fopen()
を介して呼び出されなくても、プログラム内のどこかにある限り意味しmain()
ます。
私はかなり長い間この問題を抱えていましたが、何が原因なのかわかりません:
- 私は何度もnewlibを再構築しました
- プログラム ヘッダーの代わりにセクション ヘッダーからコードをロードするように ELF ローダーを変更しました。
- newlib/libgloss を個別にビルドしようとしました (失敗しました)
GROUP
、gcc、およびldを使用してldスクリプトを介してライブラリ(libc、libnosys)をリンクしました
他にどのような情報を含めるべきかはよくわかりませんが、できる限り含めていただければ幸いです。
編集:確認するために、発生しているページ フォールトは、失敗した関数のアドレスではありません。それらはプログラムの他の場所にあります。たとえば、fopen()
0x08048170 にある を呼び出すと、0xA00A316C でページ フォールトが発生します。
編集 2: ELF をロードするための関連コード:
編集 3: などのシステム コールを呼び出してから2 回以上呼び出すと、不明なオペコード割り込みが発生することにwrite()
気付きました。printf()
奇数。
cygwin - mips クロス コンパイラのインストールに関する問題
修士論文を執筆中ですが、クロス コンパイラの設定に問題があります。多くの記事、よくある質問、チュートリアルなどを読みましたが、何かが欠けていると思います。おそらく非常に愚かで基本的なものかもしれませんが、それがなければ、すべての明確なビジョンを持つことはできず、できません。すべてがうまくいくように…なので、お気軽にすべてを説明してください。問題に行きましょう。
私は SoClib を使用して、多くの MIPS と多くの RAM を備えた NoC を設計しています。すべての MIPS を 1 つの RAM から読み取るように、すべての RAM に異なるアプリケーションをロードしたいと考えています。非常に単純なアプリケーション (割り込み付きのハロー ワードなど) を使用してそれを行うことができたので、MIPS をより強力な方法で使用する JPEG デコーダーを実現しようとしていました。問題は、私が使用しているクロス コンパイラが基本的な stdio 関数を見つけることができないため、mips 用のアプリケーションをコンパイルできないことです。したがって、基本的に、動作する完全なクロス コンパイラをインストールすることができませんでした。
1) SoClib と一緒にインストールされたクロスコンパイラから始めましょう: インストールするために私が従ったガイドがあります : http://www.soclib.fr/trac/dev/wiki/CrossCompilerこれは完全なクロスコンパイラではありません。mips 用の elf コードを生成できるが、C 関数を使用できない第 1 段階の gcc のみをインストールしました。これで、C ライブラリをコンパイルして、新しいクロス コンパイラを作成する必要があります。したがって、それが機能しないのは正常ですが、それは質問への答えにはなりません: printf を使用し、stdio.h をインクルードしているのに、なぜ「Hello world」が機能していたのでしょうか? 答えは、SoClib にはヘッダー stdio.h があり、関数がほとんど実現されていない (printf がある) ため、そのコンパイラで標準 C ライブラリを使用できないことがわかりました。
2) そのため、私は完全なクロス コンパイラをインストールすることに決め、非常に多くのガイドを読んだので、実際に使用した 2 つだけを投稿します: http://www.cse.iitb.ac.in /grc/gcc-workshop-11/downloads/slides/gccw11-config-build.pdf 108ページから(クロスコンパイルの問題点を説明する前) EGLIBCを使用しています。唯一の違いは、ターゲットとして「mipsel-elf」を使用したことです。私の理解が正しければ、eglibc は最初の段階のクロス コンパイラでは完全にコンパイルできないため、この方法には 3 段階のクロス コンパイラが必要です。問題は、第 1 段階のクロス コンパイラで eglibc をインストールできないことです (122 ページで失敗します)。ログを添付しました。「mipsel-elf-gcc: エラー: 認識されないオプション '-V'」および「mipsel-elf-gcc: 致命的なエラー: 入力ファイルのコンパイルが終了しませんでした」というメッセージが表示されると、問題が発生すると思います。コンパイラに問題があり、サポートされていないプラットフォームですべて終了しているようですが、ガイドにあるように eglibc/ports ディレクトリをコピーしたため、動作するはずです...</p>
3) eglibc の代わりに newlib を使用する別のガイドを試してみました: http://www(dot)cygwin(dot)com/ml/crossgcc/2005-08/msg00114/l-cross- ltr.pdf 2 段階のクロス コンパイラ。それは、newlib が最初の段階のコンパイラで完全にコンパイルできるからだと思います...そうですか? とにかく私は同じ問題を抱えています。newlib をコンパイルできず、同様のエラーが発生します (ログが添付されています)。
それが私の問題であり、ここで私はそれを解決しようとしてきたいくつかの疑問を提起します.
4) 問題は target=mipsel-elf でしょうか? gnu のドキュメントから、gnu を構成する名前は cpu-manufacturer-os (または cpu-manufacturer-kernel-os) にする必要があることを知っていますが、mipsel-elf が受け入れられることを読みました。エルフは、NoC プラットフォームに OS をロードしたくないためである必要があり、ここで 2 番目の疑いがあります…</p>
5) 問題は OS の問題でしょうか? ガイドでは Linux カーネル ヘッダーが使用されています...おそらく mipsel-elf ターゲットでは、sysroot を使用して binutils を構成するべきではありませんか? しかし、私には奇妙に聞こえます...何を変更する必要がありますか?
6) さらに別のおそらくばかげた質問です。stdio と一般的に C 関数は、OS を必要としませんよね? これらの問題のすべてが基本に疑問を抱かせているからです...それで、mipsel-elf クロス コンパイラで JPEG デコード C アプリケーションを実行できるはずですよね?
あらゆる考慮事項、アドバイス、およびヘルプをいただければ幸いです。これらの議論に関する文書があれば教えてください。私はこの分野で学び、自信をつけたいと思っています。ありがとう
eglibc ログ:
オプション '-qlanglvl=extc89' configure:2809: $? = 1
NEWLIB ログ
compilation - ツールチェーンとライブラリ
ツールチェーンをコンパイルするときは、ツールチェーンのコンパイルに使用しているライブラリを指定する必要があります。たとえば、最近、openRISCアーキテクチャ用のツールチェーンをコンパイルしました。彼らは私にuClibcとnewlibから選択するオプションを与えてくれました。
ライブラリを使用してツールチェーンをコンパイルする必要がありますか?たとえば組み込みLinuxで作業しているときに、ターゲットプラットフォームでライブラリをコンパイルし、ツールチェーン(ライブラリなしでコンパイル)を使用してライブラリをユーザープログラムにリンクすることはできませんか?ありがとうございました!
gcc - クロスコンパイラへの newlib の移植
このチュートリアルを使用してクロスコンパイラを作成しています。
gcc クロスコンパイラのチュートリアルに従い、newlib の移植に進みました。発行してコンパイルしようとするまで、すべてがうまくいきました
make all install
次のエラーが発生したとき:
コンパイルが停止します。
Ubuntu 11.10 を使用しています。
私が試してみました:
異なる gcc、binutils、および newlib バージョンを使用する (約 5 つの異なる組み合わせ)
Texinfoのインストール
makeinfo パスの修正
私のクロスコンパイラは、もちろんライブラリを含めることができないというだけで、newlib がなくても完全に動作します。
embedded - コードサイズに最適化されたNewlib
メモリに非常に敏感な組み込みアプリケーションで、newlib 関数のいくつかが多くのスタック スペースを使用していることに気付きました。newlib のソース コード、特にこの場合は memmem.c を見ると、PREFER_SIZE_OVER_SPEED と __OPTIMIZE_SIZE__ の 2 つの定義に気付きました。これにより、メモリ使用量を大幅に削減できます。私が理解している限り、これらは「サイズに最適化された」ライブラリを利用するために newlib をコンパイルするときに定義する必要があります。私はcortex-M3マイクロコントローラーを使用しているため、「サイズに最適化された」newlibを使用するARMツールチェーンがあるか、それを使用するためのオプションを提供するか、自分で構築しようとする必要があります。さらに、newlib をビルドするときに、GCC もビルドする必要がありますか、それとも単にライブラリをビルドして現在のツールチェーンで使用できますか。現在、提供されているツールチェーンで CoIDE を使用しています。
arm - ARMCortex-M3でのnewlibのmallocの使用
ARM Cortex-M3(NXPのLCP17xx)のコードを作成しています。私はこれまで静的メモリを使用してきましたが、すべてがうまく機能しました。動的メモリのサポートを追加しようとしましたが、mallocを呼び出すと、システムがスタックします。
アームベアメタル用にgccでコンパイルし、newlibを使用しています。バージョン:gcc-arm-none-eabi-4_6-2012q1
mallocサポートを追加するために、単純な_sbrk関数を実装し、リンカースクリプトを変更して、ヒープ用のスペースを確保しました(この部分に関するさまざまなチュートリアルを読みましたが、次に発生した問題については説明していません)。
いくつかのLEDの助けを借りて、コードが呼び出されるポイントまで実行されmalloc
、その後は続行されないことを確信できます。それは私の機能にさえ到達しません_sbrk
。また、後でコードにsizeof
への呼び出しを含めると、への呼び出しでスタックします。malloc
それで、コードを呼び出すときに到達したり戻ったりmalloc
することなくスタックするという間違ったことは何ですか?_sbrk
呼び出しが含まれている場合と含まれていない場合に生成されるメモリマップをしばらく見つめた後、malloc
それはによって使用される構造に関連していると思われmalloc
ます。
これは、RAMメモリを定義するldスクリプトの一部です。
次に、_end_stackが割り込みベクタテーブルに設定されます。
そして今、異なるマップの比較。コードでmallocを使用しない場合:
コードでmallocを使用したメモリマップ: