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