自己动手构造编译系统:编译、汇编与链接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的偏移。
相关文章
- 【Rust日报】2022-12-26 Rust编写 chip8 模拟器
- [Rust笔记] 对照 OOP 浅谈【类型状态】设计模式
- 【Rust日报】2022-12-27 Rust 中的 K/V 存储引擎
- 【Rust日报】2022-12-28 Rust 中的原生反射
- 【Rust日报】2022-12-30 如何将一个PHP项目迁移到Rust
- 【Rust日报】2022-12-31 Rust 如何测试?
- 【Rust 日报】2023-01-01 祝所有锈儿2023新年快乐
- 【Rust日报】2023-01-03 turmoil - 由 Tokio 推出用于开发和测试分布式系统的框架
- 【Rust 日报】2023-1-5 tdp-tl 用Rust实现的3D打印机模拟器
- 【Rust 日报】2023-1-6 Rust是不是与C++一样差劲
- 【Rust 日报】2023-01-08 Rust新年夜话——2022年回顾
- 【Rust日报】2023-01-10 dora-rs :机器人中间件项目
- 【Rust日报】2023-01-10 BlackBerry 和 Elektrobit 通过支持 Rust 编程语言加强汽车安全
- 【Rust日报】2023-01-12 Rust 需要拥有“自己的”调试用户体验
- 【Rust日报】2023-01-14 实验性的跨平台 UI 框架 viewbuilder
- 【Rust 日报】2023-01-15 交互式AI训练模拟器
- 【Rust日报】2023-01-16 微软在Azure Sphere IoT 平台上应用 Rust
- 【Rust日报】2023-01-17 Servo 将继续开发
- 【Rust日报】2023-01-18 希望你能早点学到的 Rust 技巧
- 【Rust 日报】2023-1-19 Lars Bergstrom当选为Rust基金会董事会主席