引言
/* hello.c */
#include <stdio.h>
int main()
{
printf("helloworld!/n");
return 0;
}
- 執行gcc hello.c -o d:\hello
- linux下執行readelf -s hello | grep FUNC可看看裏面的東西如下
- 用戶的代碼是從main開始的,雖然只寫了main函數,
- 但從上面的函數表可以看到還有其它很多函數,比如_start函數。
- 實際上程序真正的入口並不是main函數,以下面命令對hello.c代碼進行編譯:
編譯
-
gcc hello.c -nostdlib
-
-nostdlib命令是指不鏈接標準庫,報錯說找不到entry symbol _start,
- 這裏是說找不到入口符號_start,也就是說程序的真正入口是_start函數。
-
實際上main函數只是用戶代碼的入口,它會由系統庫去調用,在main函數之前,
- 系統庫會做一些初始化工作,比如分配全局變量的內存,初始化堆、線程等,
- 當main函數執行完後,會通過exit()函數做一些清理工作,用戶可以自己實現_start函數:
自己實現_start函數
/* hello_start.c */
#include <stdio.h>
#include <stdlib.h>
_start(void)
{
printf("hello world!/n");
exit(0);
}
- 執行gcc hello_start.c -nostartfiles -ohello_start
- -nostartfiles的功能是Do notuse the standard system startup files when linking,
- 也就是不使用標準的startupfiles,但是還是會鏈接系統庫,所以程序還是可以執行的。
- 同樣我們查看符號表: