加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 了解C程序中的汇编语言_start标签

发布时间:2020-12-13 23:19:45 所属栏目:Linux 来源:网络整理
导读:我编写了一个简单的c程序,并尝试使用GDB来调试程序.我理解在main函数中使用以下内容: 进入时 push %ebpmov %esp,%ebp 退出时 leaveret 然后我在_start上尝试了gdb,得到了以下内容 xor %ebp,%ebppop %esimov %esp,%ecxand $0xfffffff0,%esppush %eaxpush %es
我编写了一个简单的c程序,并尝试使用GDB来调试程序.我理解在main函数中使用以下内容:

进入时

push   %ebp
mov    %esp,%ebp

退出时

leave
ret

然后我在_start上尝试了gdb,得到了以下内容

xor    %ebp,%ebp
pop    %esi
mov    %esp,%ecx
and    $0xfffffff0,%esp
push   %eax
push   %esp
push   %edx
push   $0x80484d0
push   $0x8048470
push   %ecx
push   %esi
push   $0x8048414
call   0x8048328 <__libc_start_main@plt>
hlt
nop
nop
nop
nop

我无法理解这些线条以及这背后的逻辑.

有人可以提供任何指导来帮助解释_start的代码吗?

解决方法

以下是您发布的代码 assembly source的评论.

总结一下,它做了以下事情:

>建立一个ebp = 0的哨兵堆栈帧,这样走遍堆栈的代码就可以轻松找到它的结尾
>将命令行参数的数量弹出到esi中,这样我们就可以将它们传递给__libc_start_main
>将堆栈指针与16位的倍数对齐,以符合ABI.在某些版本的Linux中不能保证这种情况,因此必须手动完成以防万一.
> __libc_csu_fini,__ libc_csu_init的地址,参数向量,参数个数和main的地址被作为参数推送到__libc_start_main
> __libc_start_main被调用.此函数(源代码here)设置一些glibc内部变量,最终调用main.它永远不会回来.>如果由于任何原因__libc_start_main应该返回,则会在之后放置一条hlt指令.用户代码中不允许使用此指令,并且应该导致程序崩溃(希望如此).>最后一系列nop指令是汇编程序插入的填充,因此下一个函数以16字节的倍数开始,以获得更好的性能.在正常执行中永远不会达到它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读