これらのプログラムを使用してください
int main()
{
return 0;
}
- そして静的にリンクすると、システムのいくつかのライブラリが最終バイナリにリンクされます。
- そして、動的接続を使用すると、実行時にライブラリがロードされますか?
本質的に最も単純なプログラムにも常にライブラリが必要です。それでは、その理由は何ですか?実行したいすべての標準エントリポイントが実際に_startだと思うので、この質問をします(私の考えでは、glibcというライブラリにあるようです)。おそらく、設定の観点から_startが正確に何をしているのかわからないので、そこにあるポインタも役に立ちます。
ベストアンサー1
標準の移植可能な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
with gcc
)を使用して他の場所を指すことができます。