4

助けが必要です!! 動的リンクなしで、スタンドアロンの実行可能ファイルを構築しようとしています。

小さなテスト プログラムを作成し、test.o という名前の再配置可能なオブジェクト ファイルを生成しました。GNU リンカーを使用してスタンドアロンの実行可能ファイルをビルドしようとすると、次のエラーが発生します。

$ld -static -o test test.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/libc.a /usr/lib/gcc/i486-linux-gnu/4.4/libgcc .a /usr/lib/gcc/i486-linux-gnu/4.4/libgcc_eh.a /usr/lib/gcc/i486-linux-gnu/4.4/libgcc_eh.a(unwind-dw2-fde-glibc.o):関数_Unwind_Find_FDE': (.text+0x190b): undefined reference to内 dl_iterate_phdr'

未定義シンボル dl_iterate_phdrを解決する方法。このシンボルはどのアーカイブに存在しますか?

ありがとう!!!

EDIT1:

よくわからない場合に備えて、私の動機はスタンドアロンの実行可能ファイルを生成することです。つまり、メモリにロードされている間に完全に実行の準備ができている実行可能ファイルです。つまり、すべてのシンボルの解決と再配置は、動的リンカーではなくプログラムリンカー自体によって行われます。 . そのような実行可能ファイルを生成することは可能ですか?

最終更新:

これで、以下のコマンドを使用して ld に直接準拠できるようになりました。

$ld -static -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.4.3/crtbeginT.o /usr/lib/gcc/ i486-linux-gnu/4.4.3/crtend.o test.o --start-group /usr/lib/gcc/i486-linux-gnu/4.4.3/libgcc.a /usr/lib/gcc/i486- linux-gnu/4.4.3/libgcc_eh.a /usr/lib/libc.a --end-group

man ld は言う --start-group archives --endgroup は循環参照を解決するために使用されます!! また、シンボル dl_iterate_phdr が libc.a で定義されていることもわかりました。

助けてくれてありがとう!!

4

3 に答える 3

4

GNU リンカーを使用してスタンドアロンの実行可能ファイルをビルドしようとすると、

しないでください。を使用しldてユーザー空間プログラムをリンクすることは、ほとんどの場合バグです。あなたのリンク行は確かに間違っています。

コンパイラ ドライバを使用して、面倒な作業を行います。これはうまくいくはずです:

gcc -static -o test test.o

スタンドアロンの実行可能ファイルをビルドしたかったので、ld を使用しようとしています。

GCC でビルドされた実行可能ファイルがld でビルドされた実行可能ファイルよりもスタンドアロンではない、とあなたが信じる理由は何ですか? それが何であれ、あなたは間違っています:単に正しい引数でgcc呼び出すだけです。ld

于 2013-01-15T06:49:51.900 に答える