zoukankan      html  css  js  c++  java
  • 真正的代码起始

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

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

    • 可以通过打印出一个变量_start(符号)的地址进行查看
    #include <stdio.h>
     
    extern _start; /* 来自于外部的声明 */
     
    int main(void)
    {
        printf("_start = %p
    ", _start);
     
        return 0;
    }
    
    • 也可以通过objdump -d Executable File进行反汇编查看真正代码的入口地址
    • 可以看见上图反汇编中的一个起始,看机器代码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
    
    • .
    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态
    
    如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦   
    
    如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我:vforbox@gmail.com
  • 相关阅读:
    windows2008下载
    js代码格式化
    javascript小实例【第二课时笔记】
    学习CSS的一些有效资源
    javascript小实例【第一课时笔记】
    关于HTML5的一些基础知识
    javascript小实例【第三课时笔记】
    c#缓存介绍(转)
    [C#] String与string的区别
    Asp.Net Cache缓存使用代码
  • 原文地址:https://www.cnblogs.com/vforbox/p/6242677.html
Copyright © 2011-2022 走看看