2

x86_64 プラットフォームで "gcc -S" -> "as" -> "ld" によって簡略化された C ソース ファイルをコンパイルしようとしています。

プロセスはエラーなしで終了しましたが、実行すると「No such file or direcotry」というエラー メッセージが表示されます。

ctest.c
int main()
{
    return 0;
}

> gcc -S ctest.c
> as -o ctest.o ctest.s
> ld -o ctest  /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o
> ./ctest 
bash: ./ctest: No such file or directory

> uname -a
Linux mkb3 2.6.27.48-0.3-default #1 SMP 2010-09-20 11:03:26 -0400 x86_64 x86_64 x86_64 GNU/Linux

また、いくつかのGoogleの結果に記載されているように、動的リンクを追加しようとしました.

> ld -o ctest -dynamic-linker /lib64/ld-linux.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o

しかし、エラーは残りました。

コメントや提案をお待ちしております。

編集: Linux ボックスに /lib64/ld-linux.so.2 が存在しないというミスを犯しました。/lib64/ld-2.9.so を使うべきでした。指定された存在しないライブラリ ファイルで ld がエラーを報告しないことを知りませんでした。

4

2 に答える 2

2

32ビット用では-dynamic-linker /lib/ld-linux-x86-64.so.2なくを使用してリンクする必要があります。/lib64/ld-linux.so.2

/lib64 $ file -L ld*
ld-linux.so.2:        ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
ld-linux-x86-64.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

全体として、これは私にとってはうまくいきます:

$ gcc -S ctest.c
$ as -o ctest.o ctest.s
$ ld -o ctest -dynamic-linker /lib/ld-linux-x86-64.so.2 /usr/lib64/crt1.o /usr/lib64/crti.o ctest.o -lc /usr/lib64/crtn.o

それでも機能しない場合は、@ nmの提案に従い、の出力を確認してくださいgcc -v -o ctest ctest.c

于 2011-08-23T08:32:41.637 に答える
1

-dynamic-linker私にとってはうまくいきますが、私は32ビットシステムを持っています。

実行gcc -v -o ctest ctest.oして、出力の最後の行を確認します。コマンドとして実行してみてください。それが機能する場合は、機能しなくなるまで部品を捨てて、単純化を開始します。次に、さらにいくつかのパーツを捨てるなどします。これが、機能するコマンドにたどり着いた方法です。

gcc -o ctest ctest.o代わりに使用することもできます。

于 2011-08-23T08:00:19.127 に答える