当面の問題は、デフォルトでインタープリターとして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 から戻るだけで、 exit
syscall を直接使用しないでください (exit
本当に必要な場合は、libc の関数を使用することもできます)。一般に、syscall の使用は推奨されません。