从编译器角度理解C++代码的编译和链接原理

在这里插入图片描述

1. 编译过程中,符号是不生成虚拟地址的。

2. 链接阶段,各个段就要进行合并了:.text<=>.text、.data<=>.data、.bss<=>.bss

  • 步骤一:所有对符号的引用,都要找到该符号定义的地方。
    常见问题:符号未定义、符号重定义

  • 步骤二:符号解析成功以后,给所有的符号分配虚拟地址。

3. 常用命令

// -o:指定生成可执行文件的名称。使用方法为:g++ -o afile file.cpp file.h ... 
// -c:只编译不链接,只生成目标文件。
// -g:添加gdb调试选项。
g++ -c main.cpp // 生成main.o文件
objdump -t main.o // 查看.o文件的符号表
readelf -h main.o // 查看ELF文件头
objdump -s main.o // 查看常见段,如.text、.data
readelf -S main.o // 查看所有段
g++ -c main.cpp -g // 生成main.o文件,添加调试信息
objdump -S main.o // 查看汇编后代码
ld -e main *.o // 链接,main代表入口文件,生成a.out
objdump -t a.out // 查看符号表
objdump -S a.out // 查看汇编后代码(有地址,说明可执行)
readelf -h a.out // 查看ELF文件头:类型由 可重定向文件 变为 可执行文件;程序入口地址变为程序代码第一行地址(objdump -S a.out可查看)
readelf -l a.out // 查看program headers段:哪些需要加载到内存中

4. 如何从虚拟地址到物理地址

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值