Linux

所有c程序都需要載入庫嗎?

  • December 13, 2019

使用類似的程序

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,symwith gcc) 將其指向其他地方。

引用自:https://unix.stackexchange.com/questions/557125