请各位大神们帮忙看一下这个调用子程序对吗,其它的我都看明白了就是后面U负44.8的数据怎么请大神算出来的

最近面试技术经理问我汇编到main函数步骤是什么,当时我是一脸疑惑what?main函数就不是C语言调用第一个函数吗后面我自己查了相关资料,才发现自己too young too navie.

很多人只知道main函数是c語言的第一个调用函数其实不是,下面用个例子说明

在开始讲解之前我先科普一下知识,平时我们编译.c文件是一般分为三个步骤:

-S苼成汇编代码,-c生成目标文件gcc生成可执行文件。


好了下面我们来写个程序!
创建一个test.c文件,里面写以下代码

嘻嘻没错,我故意没写main函数看看会编译后会发生什么结果!


这个编译结果有两个意思,第一个是在Scrt1.o文件里调用了_start函数第二个意思是在_start函数中没调用main函数。这說明main函数并不是我们所说的C语言第一个调用的函数下面用更具体的证据证明。

下面我们查看Scrt1.o里面调用了什么:
D是初始化data段U是undefined的含义,說明main函数在该文件中未定义但是T _start代表存在代码区 _start,并且在_start里面调用了main函数进一步证实了我们的猜测。

如果小伙伴想深究下去main函数怎么請大神调用请继续往下看!
我们先修改main.c文件代码,加上main函数

然后我们编译是没有报错的然后我们反编译该代码

我们发现这里面调用了__libc_start_main函数,但是该函数并没有在Scrt1.o里面调用其实我们根据名字可以猜测到,该函数调用在libc库中调用
的反汇编中肯定是找不到的,然而我们找箌了这个:

从上面可以说明编译一个.c文件,除了要链接Scrt1.o文件和libc库

以上是我在Ubuntu 20系统上debug 出来的结果,但是实际每个系统出现现象会有不一樣但是具体原理基本不便,所以小伙伴要多动手多动脑。

我要回帖

更多关于 请大神 的文章

 

随机推荐