真正的代码起始

c程序中真正的入口也就是代码的起始并不是main函数

  • Linux 操作系统中有这样一条命令ld也就是链接器
  • 链接器最后将各种各样的目录文件链接成可执行文件的时候它会去用到一个链接的脚本文件,可通过ld --verbose命令加参数就可以打印默认的链接脚本,查看脚本最上方的有一句话,它定义了代码和数据的起始地址
    799868-20170102163725675-937742973.png
  • 上图中的意思是可执行的代码数据段起始地址是0x400000,如果我们修改了脚本文件的起始地址,那么数据段和代码段都会相应的发生改变

  • 可以通过打印出一个变量_start(符号)的地址进行查看
#include <stdio.h>
 
extern _start; /* 来自于外部的声明 */
 
int main(void)
{
    printf("_start = %p\n", _start);
 
    return 0;
}
  • 也可以通过objdump -d Executable File进行反汇编查看真正代码的入口地址
    799868-20170102163925144-1709018429.png
  • 可以看见上图反汇编中的一个起始,看机器代码31 ed 49 89 d1 ...,为了验证_start符号进一步的说明是代码的起始,可通过objcopy -O 提取代码段并通过hexdump -C进行查看
$ # objcopy -O binary[格式] -j .text[代码]/.data[数据] print[可执行文件] text.bin/data.bin[指令]
$ objcopy -O binary -j .text print text.bin
$ hexdump -C text.bin
  • .
    799868-20170102164017956-1653963498.png

转载于:https://www.cnblogs.com/vforbox/p/6242677.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值