2

私は知っています、それはすでに何百万回も尋ねられました... 残念ながら。

しかし、私は ARM Cortex M4 プロセッサのメタル ビルドに取り組んでいます。したがって、共有ライブラリはなく、静的なものだけです。プログラムを gcc とリンクすると、次のエラーがスローされます。

$ arm-none-eabi-gcc -Wall lots_of_code.o libFW.a
arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/armv7e-m/fpu/libg.a(lib_a-exit.o):
In function `exit':
exit.c:(.text.exit+0x16): undefined reference to `_exit'
collect2: error: ld returned 1 exit status

libFW.a は、_exit() を提供する syscalls.o というファイルを含む、私が作成したライブラリです。

$ arm-none-eabi-nm -s libFW.a | grep _exit
_exit in syscalls.o
00000018 T _exit

gcc は libg.a と lot_of_code.o をリンクしようとしているようですが、_exit() についてはまだ知りません。しかし、奇妙なことは次のとおりです。syscalls.o に直接リンクすると、正しく動作します。

$ arm-none-eabi-gcc -Wall lots_of_code.o syscalls.o libFW.a

何が原因でしょうか?

4

1 に答える 1

1

リンク コマンド ラインで指定してオブジェクト ファイルを強制的にリンクすると、必要なシンボルが提供されているかどうかに関係なく、オブジェクト ファイルがプログラムに組み込まれます。ライブラリからリンクすると、ライブラリが読み込まれた時点で未定義のシンボルの少なくとも 1 つを満たす場合にのみ、プログラムに含まれます。

静的ライブラリ間で循環依存関係を持つことは悪い考えです。回避策は、ライブラリを 2 回リンクすることです。また、通常、システム提供の関数などをexit()独自の化身で置き換えることもお勧めできません。exit()C ライブラリがwhich 呼び出しを取得しているように見えます_exit()が、何らかの理由で、_exit()その後にリンクされたライブラリに no がありません。率直に言って、それはすべて少し奇妙です。syscalls.oコンパイラ (O/S) が提供する機能よりも優れていると思うのはなぜですか? システム コールを強制的にリンクする必要がある場合はsyscalls.o、メインの C ライブラリ (このような呼び出しが多数ある場所) をリンクする前に、 で定義されているシンボルの 1 つを参照する必要があります。

于 2013-12-21T21:01:59.987 に答える