自己动手构造编译系统:编译、汇编与链接1.3.4 链接-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

自己动手构造编译系统:编译、汇编与链接1.3.4 链接

简介:

1.3.4  链接

  

         使用GCC命令进行目标文件链接很简单:

gcc hello.o –o hello

  GCC默认使用动态链接,如果要进行静态链接,需加上-static选项:

gcc hello.o –o hello –static

  这样生成的可执行文件hello便能正常执行了。

  我们使用objdump命令查看一下静态链接后的可执行文件内的信息。由于可执行文件中包含了大量的C语言库文件,因此这里不便将文件的所有信息展示出来,仅显示最终main函数的可执行代码。

080482c0 <main>:

 80482c0:         55                       push          %ebp

 80482c1:         89 e5                    mov           %esp,%ebp

 80482c3:         83 e4 f0                 and      $0xfffffff0,%esp

 80482c6:         83 ec 10                 sub      $0x10,%esp

 80482c9:         b8 28 e8 0a 08           mov           $0x80ae828,%eax

 80482ce:         89 04 24                 mov           %eax,(%esp)

 80482d1:         e8 fa 0a 00 00       call       8048dd0 <_IO_printf>

 80482d6:         b8 00 00 00 00     mov           $0x0,%eax

 80482db:         c9                       leave 

 80482dc:         c3                       ret

  从main函数的可执行代码中,我们发现汇编过程中描述的无法确定的符号地址信息在这里都被修正为实际的符号地址。如“Hello World !”字符串的地址为0x080ae828,printf函数的地址为0x08048dd0。这里符号_IO_printf与printf完全等价,call指令内部相对地址为0x000afa,正好是printf地址相对于call指令下条指令起始地址0x080482d6的偏移。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接