7

次のコマンドを使用して、hello world を組み立てています。

nasm -f elf64 test.asm

次に、これにリンクします。

ld -s test.o -lc

私はこれが機能することを知ってfile a.outいます

a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), stripped

ただし、これを実行すると./a.out取得されますbash: ./a.out: No such file or directory

libc なしでリンクすると、問題なく動作します。libc にリンクされた exe を実行するにはどうすればよいですか?

4

1 に答える 1

14

当面の問題は、デフォルトでインタープリターとしてld使用/lib/ld64.so.1することであり、それを見逃す可能性があります(シンボリックリンク/lib64/ld-linux-x86-64.so.2または適切なものである可能性があります):

$ readelf -l a.out | grep interpreter
      [Requesting program interpreter: /lib/ld64.so.1]
$ ls -l /lib/ld64.so.1
ls: cannot access /lib/ld64.so.1: No such file or directory

-dynamic-linker /lib64/ld-linux-x86-64.so.2オプションをld呼び出しに渡してインタープリターを明示的に設定することで、これを回避できます。

$ ld -s -dynamic-linker /lib64/ld-linux-x86-64.so.2 test.o -lc
$ readelf -l a.out | grep interpreter
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
$ ./a.out
$

ただし、単純な経験則としてgcc、libc が必要な場合はリンクに使用することです。これにより、すべてが適切に行われます。mainまた、通常の libc 起動コードが初期化される可能性があるように、必ずエントリ ポイントとして使用してください。同様にmain、最後にyour から戻るだけで、 exitsyscall を直接使用しないでください (exit本当に必要な場合は、libc の関数を使用することもできます)。一般に、syscall の使用は推奨されません。

于 2012-12-21T12:51:32.373 に答える