Linux
所有c程序都需要載入庫嗎?
使用類似的程序
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 +++
您必須至少執行一個系統呼叫,即
_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
withgcc
) 將其指向其他地方。