亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言之沒有main函數的helloworld示例

2020-01-26 15:09:11
字體:
來源:轉載
供稿:網友

幾乎所有程序員的第一堂課都是學習helloworld程序,下面我們先來重溫一下經典的C語言helloworl

復制代碼 代碼如下:

/* hello.c */ 
#include <stdio.h> 
 
int main() 

    printf("hello world!/n"); 
    return 0; 


這是一個簡單得不能再單的程序,但它包含有一個程序最重要的部分,那就是我們在幾乎所有代碼中都能看到的main函數,我們編譯成可執行文件并查看符號表,過濾出里面的函數如下(為了方便查看我手動調整了grep的輸出的格式,所以和你的輸出格式是不一樣的)
復制代碼 代碼如下:

$ gcc hello.c -o hello 
$ readelf -s hello | grep FUNC 
Num:    Value          Size Type    Bind   Vis      Ndx Name 
27: 000000000040040c     0 FUNC    LOCAL  DEFAULT   13 call_gmon_start 
32: 0000000000400430     0 FUNC    LOCAL  DEFAULT   13 __do_global_dtors_aux 
35: 00000000004004a0     0 FUNC    LOCAL  DEFAULT   13 frame_dummy 
40: 0000000000400580     0 FUNC    LOCAL  DEFAULT   13 __do_global_ctors_aux 
47: 00000000004004e0     2 FUNC    GLOBAL DEFAULT   13 __libc_csu_fini 
48: 00000000004003e0     0 FUNC    GLOBAL DEFAULT   13 _start 
51: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.2.5 
52: 00000000004005b8     0 FUNC    GLOBAL DEFAULT   14 _fini 
53: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_ 
58: 00000000004004f0   137 FUNC    GLOBAL DEFAULT   13 __libc_csu_init 
62: 00000000004004c4    21 FUNC    GLOBAL DEFAULT   13 main 
63: 0000000000400390     0 FUNC    GLOBAL DEFAULT   11 _init 

大家都知道用戶的代碼是從main函數開始執行的,雖然我們只寫了一個main函數,但從上面的函數表可以看到還有其它很多函數,比如_start函數。實際上程序真正的入口并不是main函數,我們以下面命令對hello.c代碼進行編譯

復制代碼 代碼如下:

$ gcc hello.c -nostdlib 
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400144 

-nostdlib命令是指不鏈接標準庫,報錯說找不到entry symbol _start,這里是說找不到入口符號_start,也就是說程序的真正入口是_start函數

實際上main函數只是用戶代碼的入口,它會由系統庫去調用,在main函數之前,系統庫會做一些初始化工作,比如分配全局變量的內存,初始化堆、線程等,當main函數執行完后,會通過exit()函數做一些清理工作,用戶可以自己實現_start函數

復制代碼 代碼如下:

/* hello_start.c */ 
#include <stdio.h> 
#include <stdlib.h> 
 
_start(void) 

    printf("hello world!/n"); 
    exit(0); 


執行如下編譯命令并運行
復制代碼 代碼如下:

$ gcc hello_start.c -nostartfiles -o hello_start 
$ ./hello_start 
hello world! 

這里的-nostartfiles的功能是Do not use the standard system startup files when linking,也就是不使用標準的startup files,但是還是會鏈接系統庫,所以程序還是可以執行的。同樣我們查看符號表

復制代碼 代碼如下:

$ readelf -s hello_start | grep FUNC 
Num:    Value          Size Type    Bind   Vis      Ndx Name 
20: 0000000000400350    24 FUNC    GLOBAL DEFAULT   10 _start 
21: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.2.5 
22: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND exit@@GLIBC_2.2.5 

現在就只剩下三個函數了,并且都是我們自己實現的,其中printf由于只有一個參數會被編譯器優化為puts函數,在編譯時加-fno-builtin選項可以關掉優化

如果我們在_start函數中去掉exit(0)語句,程序執行會出core,這是因為_start函數執行完程序就結束了,而我們自己實現的_start里面沒有調用exit()去清理內存

好不容易去掉了main函數,這時又發現必須得有一個_start函數,是不是讓人很煩,其實_start函數只是一個默認入口,我們是可以指定入口的

復制代碼 代碼如下:

/* hello_nomain.c */ 
#include <stdio.h> 
#include <stdlib.h> 
 
int nomain() 

    printf("hello world!/n"); 
    exit(0); 

采用如下命令編譯

復制代碼 代碼如下:

$ gcc hello_nomain.c -nostartfiles -e nomain -o hello_nomain 

其中-e選項可以指定程序入口符號,查看符號表如下
復制代碼 代碼如下:

$ readelf -s hello_nomain | grep FUNC 
Num:    Value          Size Type    Bind   Vis      Ndx Name 
20: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.2.5 
21: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND exit@@GLIBC_2.2.5 
22: 0000000000400350    24 FUNC    GLOBAL DEFAULT   10 nomain 

對比hello_start的符號表發現只是將_start換成了nomain

到這里我們就很清楚了,程序默認的入口是標準庫里的_start函數,它會做一些初始化工作,調用用戶的main函數,最后再做一些清理工作,我們可以自己寫_start函數來覆蓋標準庫里的_start,甚至可以自己指定程序的入口

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区直播精品电影| 欧美在线xxx| 欧美视频中文字幕在线| 国产不卡精品视男人的天堂| 日韩黄色在线免费观看| 亚洲天堂av综合网| 国产在线不卡精品| 最近2019免费中文字幕视频三| 久久福利网址导航| 法国裸体一区二区| 97色在线观看| 亚洲女人初尝黑人巨大| 日韩av电影国产| 日本不卡免费高清视频| 国产精品美女久久久免费| 成人午夜黄色影院| 亚洲国产天堂网精品网站| 久久精品国产欧美激情| 国产日韩欧美在线播放| 欧美日韩性生活视频| 这里精品视频免费| 亚洲人精选亚洲人成在线| 国产精品极品美女在线观看免费| 中文字幕亚洲综合久久| 成人精品视频在线| 国产日韩专区在线| 国产色视频一区| 欧美激情性做爰免费视频| 亚洲自拍av在线| 欧美天天综合色影久久精品| 欧美一级视频在线观看| 亚洲精品久久久一区二区三区| 久久久久久中文| 97超级碰在线看视频免费在线看| 精品久久久久久中文字幕一区奶水| 国产欧美日韩综合精品| 亚洲人成电影网站色…| 国产精品爱啪在线线免费观看| 亚洲日本中文字幕| 精品中文字幕在线| 91视频九色网站| 热re99久久精品国产66热| 欧美麻豆久久久久久中文| 日本精品在线视频| 日韩精品视频在线免费观看| 久久躁日日躁aaaaxxxx| 亚洲欧美日韩国产精品| 国产suv精品一区二区三区88区| 91精品国产777在线观看| 亚洲欧美国产精品专区久久| 亚洲一区亚洲二区| 日韩免费中文字幕| 久久久久99精品久久久久| 欧美激情视频一区二区三区不卡| 91精品视频一区| 国产欧美一区二区白浆黑人| 国产精品一区二区久久久| 成人做爽爽免费视频| 久久99热这里只有精品国产| 日韩在线视频播放| 这里只有视频精品| 亚洲精品白浆高清久久久久久| 91国产精品视频在线| 亚洲一区二区久久| 亚洲电影免费观看高清完整版| 国产精品嫩草视频| 久久视频精品在线| 亚洲视频电影图片偷拍一区| 久热爱精品视频线路一| 日韩欧美中文字幕在线观看| 欧美精品18videos性欧| 午夜精品久久久久久久白皮肤| 日韩欧美aaa| 欧美裸身视频免费观看| 久久这里只有精品视频首页| 国产精彩精品视频| 国产精品福利久久久| 岛国av一区二区在线在线观看| 亚洲综合中文字幕在线| 日韩高清欧美高清| 自拍偷拍亚洲一区| 国产精品久久久久久av福利| 欧美裸体xxxx极品少妇| 亚洲自拍偷拍一区| 欧美亚洲免费电影| 91精品在线播放| 欧美午夜性色大片在线观看| 中文字幕少妇一区二区三区| 日本中文字幕成人| 一区二区三区亚洲| www亚洲欧美| 日韩资源在线观看| 中文字幕精品网| 国产午夜精品免费一区二区三区| 亚洲精品中文字幕av| 成人欧美一区二区三区在线| 亚洲永久免费观看| 日本欧美爱爱爱| 亚洲免费视频网站| 日韩av影视在线| 亚洲欧洲美洲在线综合| 亚洲男人的天堂网站| 热re91久久精品国99热蜜臀| 国产视频丨精品|在线观看| 国产精品丝袜久久久久久不卡| 国产成人综合av| 亚洲加勒比久久88色综合| 国产精品88a∨| 欧美最猛性xxxxx免费| 欧美视频专区一二在线观看| 久久精品久久久久久国产 免费| 日韩av网址在线| 在线免费观看羞羞视频一区二区| 在线观看日韩欧美| 一本色道久久综合狠狠躁篇的优点| 国产一区二区三区在线看| 精品久久久av| 成人黄色免费网站在线观看| www.亚洲免费视频| 亚洲欧美日韩精品久久亚洲区| 日韩在线不卡视频| 亚洲xxxx妇黄裸体| 九九久久久久久久久激情| 久久精品国产亚洲| 日韩在线观看电影| 福利视频第一区| 日本精品视频在线观看| 亚洲欧美日韩国产成人| 日本一本a高清免费不卡| 国产精品午夜视频| 国产精品99久久久久久白浆小说| 国产在线视频2019最新视频| 午夜精品久久久久久久99热| 福利微拍一区二区| 91精品国产九九九久久久亚洲| 日韩一级黄色av| 欧洲成人午夜免费大片| 国产福利精品av综合导导航| 欧美激情亚洲自拍| 日本高清视频精品| 欧美最猛性xxxxx(亚洲精品)| 色伦专区97中文字幕| 亚洲第一网中文字幕| 国产成人久久久精品一区| 色婷婷成人综合| 欧美在线精品免播放器视频| 欧美在线一区二区视频| 欧美一级高清免费| 精品小视频在线| 成人欧美一区二区三区在线湿哒哒| 国产+人+亚洲| 91精品综合久久久久久五月天| 欧美日韩国产中文精品字幕自在自线| 国产噜噜噜噜噜久久久久久久久| 日韩欧美精品网址| 国产精品综合久久久| 91成人天堂久久成人| 91视频国产一区| 91精品国产高清| 欧美日韩一区二区精品| 亚洲美女www午夜| 亚洲免费一级电影| 国产一区二中文字幕在线看| 色爱av美腿丝袜综合粉嫩av|