質問

GNU ツールチェーンを使用してプロジェクトを構築していますが、リンクするまではすべて正常に動作しますが、リンカーから「プロジェクトが見つからない」または「見つからない」というメッセージが表示されます。 crti.o. 。これは私のオブジェクト ファイルの 1 つではありません。libc に関連しているようですが、なぜこれが必要になるのか理解できません。 crti.o, 、ライブラリファイルを使用しないでしょうか。 libc.a?

Armプラットフォーム用にクロスコンパイルしています。ツールチェーンにファイルがありますが、リンカーにそれを含めるにはどうすればよいですか?

crti.o 「ライブラリ」検索パスの 1 つにありますが、検索する必要がありますか? .o ライブラリパス上のファイル?

検索パスは同じですか gcc そして ld?

役に立ちましたか?

解決

crti.o はブートストラップ ライブラリであり、一般に非常に小さいです。通常、バイナリに静的にリンクされます。で見つかるはずです /usr/lib.

バイナリディストリビューションを実行している場合、開発者はすべての開発者要素を -dev パッケージに入れる傾向があります (例:libc6-dev) は、コンパイルされたプログラムを実行する必要はなく、単にビルドするだけであるためです。

クロスコンパイルしてないんですよね?

クロスコンパイルしている場合は、通常、gcc の検索パスが crti.o の場所と一致しないことが問題です。ツールチェーンが存在したときにビルドされるべきでした。最初に確認することは、 gcc -print-search-dirs crti.o がそれらのパスのいずれかにあるかどうかを確認します。

リンクは実際には ld によって行われますが、そのパスは gcc によって渡されます。おそらく、何が起こっているのかを知る最も簡単な方法は、helloworld.c プログラムをコンパイルし、それを strace して ld に何が渡されているかを確認し、何が起こっているかを確認することです。

strace -v -o log -f -e trace=open,fork,execve gcc hello.c -o test

ログ ファイルを開いて crti.o を検索すると、非クロス コンパイラが表示されます。

10616 execve("/usr/bin/ld", ["/usr/bin/ld", "--eh-frame-hdr", "-m", "elf_x86_64", "--hash-style=both", "-dynamic-linker", "/lib64/ld-linux-x86-64.so.2", "-o"
, "test", "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "-L/usr/lib/gcc/x86_64-linux-g
nu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/lib/../lib", "-L/usr/lib/../lib", "-L/usr/lib/gcc/x86_64-linux-gnu
/"..., "/tmp/cc4rFJWD.o", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "-lc", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "/usr/lib/gcc/x86_
64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."...],  "COLLECT_GCC=gcc", "COLLECT_GCC_OPTIONS=\'-o\' \'test\' "..., "COMPILER_PATH=/usr/lib/gcc/x86_6"..., "LIBRARY_PATH=/usr/lib/gcc/x86_64"..., "CO
LLECT_NO_DEMANGLE="]) = 0
10616 open("/etc/ld.so.cache", O_RDONLY) = 3
10616 open("/usr/lib/libbfd-2.18.0.20080103.so", O_RDONLY) = 3
10616 open("/lib/libc.so.6", O_RDONLY)  = 3
10616 open("test", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crt1.o", O_RDONLY) = 4
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crti.o", O_RDONLY) = 5
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/crtbegin.o", O_RDONLY) = 6
10616 open("/tmp/cc4rFJWD.o", O_RDONLY) = 7

多数の試みが見られた場合は、 open(...crti.o) = -1 ENOENT, ld 混乱しているので、それが開くパスがどこから来たのかを確認したいと思います...

他のヒント

クロスコンパイル中に同じ問題が発生しました。crti.oが入っていました <sysroot>/usr/lib64 しかし、リンカーはそれを見つけられません。

空のディレクトリを作成すると判明 <sysroot>/usr/lib 問題を修正しました。リンカがパスを検索するようです <sysroot>/usr/lib まず、それが存在する場合にのみ、考慮します <sysroot>/usr/lib64.

これはリンカのバグでしょうか?それともこの動作はどこかに文書化されていますか?

私の場合 Linux Mint 18.0/Ubuntu 16.04, 、 私は全くない crti.o まったく:

$ find /usr/ -name crti*

何も見つからないので、開発者パッケージをインストールします。

sudo apt-get install libc6-dev

いくつかのライブラリが見つかったら ここを読んでください

OK、不足しているファイルが含まれるように、ツール チェーンを再インストールする必要がありました。gcc パス上で見つかるはずなので、奇妙に思えます。主な問題は、コンピューター上に 15 個ほどの異なる crti.o ファイルがあり、正しいファイルを指定していなかったことだと思います。まだ動作していませんが、現在は動作しています:-) ご協力ありがとうございます:-)

セットアップが不適切なクロスコンパイラーでも同様の問題が発生しました。私は次のようにそれを回避しました:

/home/rob/compiler/usr/bin/arm-linux-gcc --sysroot=/home/rob/compiler hello.c

これは、sysroot オプションが指す場所に /lib、/usr/include などが存在することを前提としています。これはおそらく本来のやり方ではありませんが、単純な C ファイルをコンパイルする必要がある場合には、このおかげで問題は解決されました。

デフォルトの Ubuntu 8.04 インストールでも同様の問題が発生します。これが機能するには、libc 開発者のヘッダー/ファイルを手動で取得する必要がありました。

これで私は解決しました(ARM用のpjsipのクロスコンパイル)。

export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top