のようなプログラムで
int main()
{
return 0;
}
- 静的にリンクすると、システム上の一部のライブラリが最終的なバイナリにリンクされます。
- 動的にリンクすると、ライブラリは実行時に読み込まれますか?
本質的に、最も単純なプログラムでもライブラリは常に必要ですか?もしそうなら、なぜですか?実行したいものの正規のエントリポイントは実際には_start(ライブラリ、つまりglibcにあると思っていた)だと思ったので、私は尋ねます。設定に関して_startが実際に何をするのかわからないので、そこにあるポインタも役に立ちます。
承認された回答:
標準のポータブルCでプログラムを作成する場合は、もちろん、main()
を呼び出すランタイムが必要です。 そもそも機能します。
ただし、それを気にしない場合は、ライブラリを省略して、インラインアセンブリを介して直接システムコールを実行できます。例えば。 x86-64の場合:
$ cat q.c
#include <sys/syscall.h>
void _start(void){
__asm__( "syscall" : : "D"(0), "a"(SYS_exit) );
}
$ cc -O2 -static -nostdlib -nostartfiles -Wall q.c -o q
$ strace ./q
execve("./q", ["./q"], 0x7fffc72d8d20 /* 39 vars */) = 0
exit(0) = ?
+++ exited with 0 +++
少なくとも1つのシステムコール、つまり_exit(2)
を実行する必要があります 、「最も単純なプログラム」でクラッシュによる終了が受け入れられる場合を除き、その場合は空のファイルでも受け入れられます;-):
$ > foo.c
$ cc -static -nostdlib -nostartfiles -Wall foo.c -o ./foo
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
$ ./foo
Segmentation fault
実行したいものの正規のエントリポイントは、実際には
_start
だと思いました。
それについて標準的なものは何もありません。 _start
リンカが使用するデフォルトの名前です。 -e sym
を使用して他の場所にポイントすることができます オプション(-Wl,-e,sym
gcc
を使用 。