精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C語言不支持重載,多種main()如何實現的呢?

開發 后端
今天借助本文,來分析下C語言中main()的實現,順便解答下群里的這個問題。

大家都知道,我是做上層應用的,對底層不是很了解,更別說那幫人在討論內核的時候,根本插不上話。更多的時候,還是默默記筆記,緊跟大佬們的步伐??。

于是,為了調研這個問題,也查了相關資料。今天借助本文,來分析下C語言中main()的實現,順便解答下群里的這個問題。

定義

作為C/C++開發人員,都知道main()函數是一個可執行程序的入口函數,大都會像如下這樣寫:

int main() {}
int main(int argc, char *argv[]) {}

但是,作為一個開發老油條,也僅僅知道是這樣做的,當看到二哥提出這個問題的時候,第一反應是重載,但是大家都知道C語言是不支持重載的,那么有沒有可能使用的是默認參數呢?如下這種:

int main(int argc = 1, char **argv = NULL)

好了,為了驗證我的疑問,咱們著手開始進行分析。

ps:在cppreference上對于main()的聲明有第三個參數即char *envp[],該參數是環境變量相關,因為我們使用更多的是不涉及此參數的方式,所以該參數不在本文的討論范圍內。

斷點調試

為了能夠更清晰的理解main()函數的執行過程,寫了一個簡單的代碼,通過gdb查看堆棧信息,代碼如下:

int main() {
return 0;
}

編譯之后,我們通過gdb進行調試,在main()函數處設置斷點,然后看堆棧信息,如下:

(gdb) bt
#0 main () at main.c:2
(gdb)

從上述gdb信息,我們看出main()位于棧頂,顯然,我們的目的是分析main()的調用堆棧信息,而這種main()在棧頂的方式顯然不足以解答我的疑問。

于是,查閱了相關資料后,發現可以通過其它方式打印出更詳細的堆棧信息。

編譯命令如下:

gcc -gdwarf-5 main.c  -o main

然后gdb的相關命令(具體的命令可以網上查閱,此處不做過多分析):

gdb ./main -q
Reading symbols from /mtad/main...done.
(gdb) set backtrace past-entry
(gdb) set backtrace past-main
(gdb) show backtrace past-entry
Whether backtraces should continue past the entry point of a program is on.
(gdb) show backtrace past-main
Whether backtraces should continue past "main" is on.

然后在main()處設置斷點,運行,查看堆棧信息,如下:

(gdb) bt
#0 main () at main.c:2
#1 0x00007ffff7a2f555 in __libc_start_main () from /lib64/libc.so.6
#2 0x0000000000400429 in _start ()
(gdb)

通過如上堆棧信息,我們看到_start()-->__libc_start_main()-->main(),看來應該在這倆函數中,開始分析~~

_start()

為了查看_start()的詳細信息,繼續在_start()函數處打上斷點,然后分析查看:

(gdb) r
Starting program: xxx
Missing separate debuginfos, use: debuginfo-install glibc-2.17-317.el7.x86_64
Breakpoint 1, 0x0000000000400400 in _start ()
(gdb) s
Single stepping until exit from function _start,
which has no line number information.
0x00007ffff7a2f460 in __libc_start_main () from /lib64/libc.so.6

通過如上分析,沒有看到_start()函數的可執行代碼,于是通過網上搜索,發現_start()是用匯編編寫,于是下載了glibc2.5源碼,在路徑處sysdeps/i386/elf/start.S

#include "bp-sym.h"
.text
.globl _start
.type _start,@function
_start:
/* Clear the frame pointer. The ABI suggests this be done, to mark
the outermost frame obviously. */
xorl %ebp, %ebp
/* Extract the arguments as encoded on the stack and set up
the arguments for `main': argc, argv. envp will be determined
later in __libc_start_main. */
popl %esi /* Pop the argument count. */
movl %esp, %ecx /* argv starts just at the current stack top.*/
/* Before pushing the arguments align the stack to a 16-byte
(SSE needs 16-byte alignment) boundary to avoid penalties from
misaligned accesses. Thanks to Edward Seidl <seidl@janed.com>
for pointing this out. */
andl $0xfffffff0, %esp
pushl %eax /* Push garbage because we allocate
28 more bytes. */
/* Provide the highest stack address to the user code (for stacks
which grow downwards). */
pushl %esp
pushl %edx /* Push address of the shared library
termination function. */
#ifdef SHARED
/* Load PIC register. */
call 1f
addl $_GLOBAL_OFFSET_TABLE_, %ebx
/* Push address of our own entry points to .fini and .init. */
leal __libc_csu_fini@GOTOFF(%ebx), %eax
pushl %eax
leal __libc_csu_init@GOTOFF(%ebx), %eax
pushl %eax
pushl %ecx /* Push second argument: argv. */
pushl %esi /* Push first argument: argc. */
pushl BP_SYM (main)@GOT(%ebx)
/* Call the user's main function, and exit with its value.
But let the libc call main. */
call BP_SYM (__libc_start_main)@PLT
#else
/* Push address of our own entry points to .fini and .init. */
pushl $__libc_csu_fini
pushl $__libc_csu_init
pushl %ecx /* Push second argument: argv. */
pushl %esi /* Push first argument: argc. */
pushl $BP_SYM (main)
/* Call the user's main function, and exit with its value.
But let the libc call main. */
call BP_SYM (__libc_start_main)
#endif
hlt /* Crash if somehow `exit' does return. */
#ifdef SHARED
1: movl (%esp), %ebx
ret
#endif
/* To fulfill the System V/i386 ABI we need this symbol. Yuck, it's so
meaningless since we don't support machines < 80386. */
.section .rodata
.globl _fp_hw
_fp_hw: .long 3
.size _fp_hw, 4
.type _fp_hw,@object
/* Define a symbol for the first piece of initialized data. */
.data
.globl __data_start
__data_start:
.long 0
.weak data_start
data_start = __data_start

上述實現也是比較簡單的:

xorl %ebp, %ebp:將ebp寄存器清零。

popl %esi、movl %esp, %ecx:裝載器把用戶的參數和環境變量壓棧,實際上按照壓棧的方法,棧頂的元素就是argc,接著其下就是argv和環境變量的數組。這兩句相當于int argc = pop from stack; char **argv = top of stack。

call BP_SYM (__libc_start_main):相當于調用__libc_start_main,調用的時候傳入參數,包括argc、argv。

上述邏輯功能,偽代碼實現如下:

void _start() {
%ebp = 0;
int argc = pop from stack
char ** argv = top of stack;
__libc_start_main(main, argc, argv, __libc_csu_init, __linc_csu_fini,
edx, top of stack);
}

__libc_start_main

在上一節中,我們了解到,_start()才是整個可執行程序的入口函數,在_start()函數中調用__libc_start_main()函數,該函數聲明如下:

STATIC int
LIBC_START_MAIN (int (*main) (int, char **, char ** MAIN_AUXVEC_DECL),
int argc, char *__unbounded *__unbounded ubp_av,
#ifdef LIBC_START_MAIN_AUXVEC_ARG
ElfW(auxv_t) *__unbounded auxvec,
#endif
__typeof (main) init,
void (*fini) (void),
void (*rtld_fini) (void), void *__unbounded stack_end)
{
#if __BOUNDED_POINTERS__
char **argv;
#else
# define argv ubp_av
#endif
/* Result of the 'main' function. */
int result;
__libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;
...
...
if (init)
(*init) (argc, argv, __environ MAIN_AUXVEC_PARAM);
...
result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);
exit (result);
}

可以看出,在該函數中,最終調用了main()函數,并傳入了相關命令行。(result = main (argc, argv, __environ MAIN_AUXVEC_PARAM);)

截止到此,我們了解了整個main()函數的調用過程,但是,仍然沒有回答二哥的問題,main()是如何實現有參和無參兩種方式的,其實說白了,在標準中,main()只有一種聲明方式,即有參方式。無論是否有命令行參數,都調用該函數。如果有參數,則通過壓棧出棧(對于x86 32位)或者寄存器(x86 64位)的方式獲取參數,然后傳入main(),如果命令行為空,則對應的字段為空(即沒有從棧上取得對應的數據)。

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2024-03-12 09:13:28

Go語言main

2021-11-08 11:02:01

Go函數重載

2011-12-09 20:28:50

2024-03-08 08:51:59

Gomain函數

2021-02-01 13:53:53

StringlongJava

2024-01-01 08:10:40

Go語言map

2024-01-05 08:45:35

Go語言map

2022-02-28 08:17:24

重載函數JS前端

2018-12-18 14:15:27

Windows 10語言版本錯誤

2020-07-02 10:30:52

iPhone蘋果北斗

2021-01-22 15:31:47

JavaSwitchString

2010-01-11 15:21:18

C++語言

2010-02-05 15:59:26

C++函數重載

2011-03-07 09:45:51

FileZilla

2021-04-20 19:23:07

語法switch-casePython

2010-06-24 17:42:08

服務不支持chkcon

2020-10-09 06:48:19

Pythonswitch語句

2021-10-27 07:15:36

Go 循環引用

2020-07-22 08:01:41

Python開發運算符

2020-10-20 07:13:44

Web動態化CSS
點贊
收藏

51CTO技術棧公眾號

国产亚洲精品久久久久久牛牛| 夜夜嗨av一区二区三区网页 | 欧美人妖巨大在线| 996这里只有精品| 日韩毛片在线一区二区毛片| 麻豆国产欧美日韩综合精品二区| 欧美精品免费在线| 无码h肉动漫在线观看| 四虎精品永久免费| 欧美日韩午夜剧场| 懂色av粉嫩av蜜臀av| 青青草在线播放| 国产裸体歌舞团一区二区| 欧美综合在线观看| 久草免费在线视频观看| 成人羞羞视频播放网站| 欧美精品一区二区蜜臀亚洲| 9久久婷婷国产综合精品性色| 国产探花视频在线观看| 成人免费在线观看入口| 欧美精品免费观看二区| 性欧美一区二区三区| 视频一区视频二区中文| 欧美精品成人91久久久久久久| av在线播放中文字幕| 亚洲免费毛片| 欧美不卡视频一区| 亚洲 国产 图片| 欧美一级大片| 午夜精品aaa| 日韩中文字幕在线不卡| 色综合久久久久综合一本到桃花网| 波多野结衣中文字幕一区| 91九色单男在线观看| 姑娘第5集在线观看免费好剧| 亚洲一级特黄| 欧美激情精品久久久久久蜜臀| 娇小11一12╳yⅹ╳毛片| 国产精品一线天粉嫩av| 日韩国产欧美区| 999精品免费视频| ady日本映画久久精品一区二区| 欧美日韩国产影片| 五月婷婷激情久久| 国产成人精品亚洲日本在线观看| 精品国产乱码久久久久久虫虫漫画| 日本人妻伦在线中文字幕| 日本www在线观看| 国产精品每日更新在线播放网址 | 国产97在线观看| 天天干天天干天天干天天| 欧美精品二区| 欧美成人免费在线观看| 外国一级黄色片| 亚洲成人二区| 欧美极品少妇xxxxⅹ免费视频| 色婷婷在线视频观看| 欧美在线日韩| 欧美激情在线播放| 国产香蕉在线视频| 国产美女诱惑一区二区| 日韩免费av在线| 无码人妻丰满熟妇区bbbbxxxx| 日韩影院免费视频| 国产精品嫩草影院一区二区| 一区二区www| 国产精品综合一区二区三区| 99久久精品无码一区二区毛片| 精品人妻无码一区二区| 国产+成+人+亚洲欧洲自线| 国产精品一区二区欧美| 青青青草原在线| 国产精品午夜春色av| 中文字幕一区综合| 羞羞的视频在线看| 大伊人狠狠躁夜夜躁av一区| 国产精品无码专区av在线播放| 欧美日韩国产网站| 欧美一区二区视频在线观看| 少妇被狂c下部羞羞漫画| 日本在线中文字幕一区| 伊人亚洲福利一区二区三区| 亚洲欧美另类日本| 亚洲国产精品一区制服丝袜| 国产mv免费观看入口亚洲| 在线观看国产精品视频| 国产ts人妖一区二区| 精品一区久久久久久| 岛国在线视频免费看| 亚洲你懂的在线视频| 国产伦精品一区二区三区四区视频_ | 国产精品久久久久久亚洲毛片| 看一级黄色录像| 高清在线视频不卡| 欧美精品一级二级| 国产精品福利导航| 香蕉视频国产精品 | 成人深夜福利| 亚洲成人黄色在线| 一级片久久久久| 尹人成人综合网| 国产精品久久久久久搜索| www.黄色一片| 国产欧美一区二区三区在线看蜜臀 | 欧美日韩在线播放一区二区| 中文字幕中文字幕在线中高清免费版| 精品成人乱色一区二区| 亚洲高清视频免费| 国产剧情一区| 97视频在线观看免费| 在线观看亚洲一区二区| 99久久久国产精品免费蜜臀| 综合国产精品久久久| 欧美粗大gay| 亚洲第一综合天堂另类专| 国产精品久久久免费看| 久久久久91| 国产精品麻豆免费版| 麻豆免费在线视频| 欧美在线小视频| 国产精品嫩草av| 欧美精品九九| 91久久久久久久一区二区| 精品视频二区| 欧美日韩在线影院| www.555国产精品免费| 亚洲精品va| 国产精品亚洲一区二区三区| 青青草在线播放| 欧美日韩在线视频首页| 亚洲av无码专区在线播放中文| 亚洲精品久久| 国产在线视频不卡| 九色视频在线观看免费播放| 欧美日韩精品在线播放| 亚洲第一黄色网址| 在线电影一区| 国产伦精品一区二区三区视频孕妇 | 国产91精品青草社区| 男人的天堂a在线| 亚洲最大色网站| 韩国三级在线看| 欧美.www| 国产九色91| а√天堂资源官网在线资源| 亚洲第一精品福利| 日韩毛片在线播放| 99久久精品免费看| 国产人妻777人伦精品hd| 国产精品自在| 91wwwcom在线观看| 婷婷色在线视频| 天天综合色天天综合| 亚洲一区二区三区无码久久| 亚洲欧美网站| 农村寡妇一区二区三区| 久久uomeier| 亚洲性av网站| 一级片在线观看视频| 国产精品久久久久精k8| 中文字幕一区二区在线观看视频| 综合久久综合| 国产偷国产偷亚洲高清97cao| 性欧美又大又长又硬| 亚洲香蕉成视频在线观看 | 麻豆成人在线观看| 在线视频91| 试看120秒一区二区三区| 欧美激情免费视频| 五月婷婷六月丁香综合| 91国产福利在线| 亚洲一级理论片| 国产成人99久久亚洲综合精品| 无码专区aaaaaa免费视频| 国产精品一区高清| 成人午夜在线观看| 2021中文字幕在线| 亚洲天堂av在线免费观看| 国产一区二区网站| 亚洲va欧美va人人爽| 中文字幕免费高清| 国产在线精品视频| 国产精品999视频| 成人在线亚洲| 91九色蝌蚪嫩草| 婷婷六月国产精品久久不卡| 日韩在线观看免费全集电视剧网站| 99国产精品欲| 色中色一区二区| 国精品无码一区二区三区| 91理论电影在线观看| 污污的视频免费| 亚洲美女色禁图| 尤物国产精品| 日韩最新在线| 91大片在线观看| 欧美羞羞视频| 国产69精品99久久久久久宅男| h视频在线免费| 亚洲成人激情图| 一级黄色片免费| 欧美视频13p| 久久久久久久久毛片| 日本一区二区三区dvd视频在线| 色悠悠在线视频| 久久国内精品视频| 日韩精品xxxx| 欧美88av| 中文字幕一区二区三区精彩视频| 宅男在线一区| 国产伦精品一区二区三区高清| 欧美aaaaaa| 69影院欧美专区视频| a视频在线播放| 中文字幕精品久久| 你懂的在线播放| 亚洲国产成人精品女人久久久 | 亚洲天堂一区在线| 亚洲最新在线观看| 卡通动漫亚洲综合| 国产蜜臀97一区二区三区| 免费a级黄色片| 成人免费视频一区| 天天爽夜夜爽视频| 精品一区二区三区免费播放| 色一情一乱一伦一区二区三区日本| 亚洲激情网站| 国产中文字幕乱人伦在线观看| 我不卡影院28| 综合操久久久| 天堂美国久久| 中文字幕日韩一区二区三区| 日产精品一区二区| 色女孩综合网| 精品国产乱码久久久久久果冻传媒| 久久人人九九| 自拍偷拍一区| 欧美一区二区视频17c| 欧美18免费视频| 久久精品国产第一区二区三区最新章节| 伊人久久影院| dy888夜精品国产专区| 日本一区二区三区视频在线看 | 国产精品天天av精麻传媒| 亚洲一区成人| 麻豆传传媒久久久爱| 天堂资源在线中文精品| 日日碰狠狠躁久久躁婷婷| 先锋亚洲精品| 手机在线看福利| 男女男精品网站| 亚洲精品午夜在线观看| 韩国三级在线一区| 中文国产在线观看| 国产成人av电影在线| 一边摸一边做爽的视频17国产| 成人激情免费电影网址| 国产精品无码专区| 久久精品人人做人人综合| 在哪里可以看毛片| 国产精品欧美久久久久无广告| 成人做爰视频网站| 一区二区免费看| 日韩精品一区二区不卡| 色综合天天综合| 中文字幕资源网| 日韩色在线观看| 午夜成人鲁丝片午夜精品| 亚洲深夜福利在线| gogo在线高清视频| 国内精久久久久久久久久人| 成人免费影院| 91精品国产综合久久久久久久久| 一区二区三区免费在线看| 好吊色欧美一区二区三区 | 欧美男人天堂网| 在线91免费看| 性xxxx视频| 精品国内自产拍在线观看| 国产三级电影在线播放| 国产精品91久久| 欧美1区2区3| 欧美日韩国产综合视频在线| 99精品在线免费在线观看| 成人精品视频在线播放| 石原莉奈一区二区三区在线观看| 在线观看岛国av| 99久久久免费精品国产一区二区 | 亚洲已满18点击进入久久| 男人日女人网站| 91精品国产全国免费观看| 亚洲人在线观看视频| 久久精品视频99| 亚洲色图官网| 5g国产欧美日韩视频| 免费久久精品| 成人免费看片'免费看| 天堂一区二区在线| av电影在线播放| 亚洲视频一区在线观看| 综合激情网五月| 日韩欧美亚洲另类制服综合在线| 久青青在线观看视频国产| 欧美肥老妇视频| 久久99国产精品二区高清软件| 国产伦精品一区二区| 久久久9色精品国产一区二区三区| 欧美精品色婷婷五月综合| 国产乱理伦片在线观看夜一区| 国产特黄级aaaaa片免| 亚洲最新视频在线播放| 国产精品乱码久久久| 亚洲美女视频网站| 激情网站在线| 91在线高清视频| 日韩视频在线观看| 国产第一页视频| www国产成人| 精品视频一区二区在线观看| 91麻豆精品久久久久蜜臀| 国产三级视频在线| 欧美自拍视频在线观看| 九九热播视频在线精品6| 久久久久亚洲av无码专区喷水| 免费成人美女在线观看.| 成人免费网站黄| 欧美日韩免费看| 天堂a中文在线| 91精品国产高清久久久久久91| 51精品国产| 在线观看av的网址| 国产一区二区精品久久91| 激情五月激情综合| 欧美三级电影在线看| 福利视频在线播放| 国产mv久久久| 精品国产午夜| 亚洲少妇第一页| 日本一区免费视频| 中文av免费观看| 中文字幕欧美日韩在线| 欧美va视频| 亚洲高清在线观看一区| 日本午夜一本久久久综合| 精品人妻中文无码av在线 | 亚洲免费高清视频在线| 国产精品久久久久久69| 日韩中文在线中文网在线观看 | 青青青爽久久午夜综合久久午夜| 97超碰在线资源| 色国产综合视频| 午夜老司机在线观看| 成人激情黄色网| 国产精品啊v在线| 国产 xxxx| 一本到高清视频免费精品| 国产在线观看网站| 国产精品稀缺呦系列在线| 日韩视频在线观看| 精品人妻一区二区乱码| 亚洲一区中文在线| 日韩一区二区三区不卡| 清纯唯美亚洲综合| av伊人久久| 中文字幕第六页| 亚洲国产视频一区二区| 桃花色综合影院| 国产精品久久视频| 亚洲色图国产| 污片免费在线观看| 欧美视频一区二区| 最近中文字幕免费mv2018在线| 国产一区二区精品在线| 久久亚洲电影| 成年人一级黄色片| 亚洲精品www久久久久久广东| 日韩高清不卡| 黄色网在线视频| 久久综合狠狠综合| 97精品久久人人爽人人爽| 午夜精品久久17c| 国内精品久久久久久久久电影网 | 欧美成人激情图片网| 另类ts人妖一区二区三区| 美女网站色免费| 亚洲一级不卡视频| 国产裸舞福利在线视频合集| 亚洲一区二区三区四区在线播放| 亚洲伦伦在线| 人与动物性xxxx| 精品亚洲一区二区三区在线观看| 久久久国产精品网站| 欧美在线一区视频| 中文字幕一区三区| 深夜福利在线视频| 92国产精品视频| 老司机精品视频网站| 国产乡下妇女做爰毛片| 中文字幕亚洲字幕| 红杏一区二区三区|