C語言程序可以沒有main函數

引言

/* 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,但是還是會鏈接系統庫,所以程序還是可以執行的。
  • 同樣我們查看符號表:

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章