zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

2023-03-09 22:21:22 时间

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的偏移。