Dengan program seperti
int main()
{
return 0;
}
- dan Anda menautkan secara statis, apakah beberapa perpustakaan di sistem Anda akan ditautkan ke biner terakhir.
- dan Anda menautkan secara dinamis, apakah perpustakaan akan dimuat saat dijalankan?
Intinya, apakah perpustakaan selalu dibutuhkan bahkan untuk program yang paling sederhana, jika demikian mengapa? Saya bertanya karena saya pikir titik masuk kanonik untuk apa pun yang ingin dieksekusi sebenarnya adalah _start (yang saya pikir ada di perpustakaan, yaitu glibc). Mungkin saya tidak mengerti apa yang sebenarnya dilakukan _start sehubungan dengan pengaturan, jadi petunjuk apa pun di sana juga akan membantu.
Jawaban yang Diterima:
Jika Anda ingin menulis program Anda dalam C portabel standar, tentu saja Anda memerlukan beberapa runtime yang memanggil main()
fungsi di tempat pertama.
Tetapi jika Anda tidak peduli tentang itu, Anda dapat membuang perpustakaan apa pun, dan melakukan panggilan sistem secara langsung melalui perakitan sebaris. Misalnya. untuk 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 +++
Anda harus melakukan setidaknya satu panggilan sistem, yaitu _exit(2)
, kecuali exit-by-crashing dapat diterima untuk "program paling sederhana", dalam hal ini file kosong juga akan melakukannya;-):
$ > 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
Saya pikir titik masuk kanonik untuk apa pun yang ingin dieksekusi sebenarnya adalah
_start
tidak ada yang kanonik tentang itu; _start
adalah nama default yang akan digunakan penaut; Anda dapat mengarahkannya ke tempat lain dengan -e sym
opsi (-Wl,-e,sym
dengan gcc
).