如何查看目标文件内.rodata+指定偏移位置存储的具体内容?
查看未链接目标文件.rodata段引用内容的方法
.rodata+偏移形式的引用,本质是访问只读数据段存储的常量,从你贴的反汇编片段判断,这些引用全部指向传给std::cout的字符串字面量。未链接的.o目标文件里.rodata段内容已经完整写入,不需要链接成可执行文件,通过以下两种方法就能直接查到对应内容:
方法一:命令行直接查看(效率最高)
- 直接输出指定段的十六进制内容+对应ASCII解码:执行
objdump -s -j .rodata assignment6_1.o,输出内容左侧第一列是.rodata段内的偏移地址,中间是十六进制原始值,右侧是对应的可打印ASCII字符。你要找的.rodata+0x41、.rodata+0x53这类位置,直接匹配左侧偏移找对应行,右侧就能看到完整的字符串内容,不需要额外计算。 - 如果想快速提取文件内所有字符串,也可以执行
strings -t x assignment6_1.o,输出会标注每个字符串在整个文件内的十六进制偏移,配合readelf -S assignment6_1.o查到的.rodata段文件起始偏移,做简单加法就能对应上你看到的段内偏移。
方法二:用Bless十六进制编辑器查看
- 先执行
readelf -S assignment6_1.o,在段表头里找到.rodata对应的条目,记下它的文件起始偏移(Offset列)。 - 用Bless打开目标文件,跳转到刚才记下的.rodata起始偏移位置,从这个位置开始计数,往后偏移0x41字节就是
.rodata+0x41对应的存储位置,编辑器右侧的ASCII预览区直接就能看到存储的内容,其余偏移(0x53、0x5e、0x6e等)按同样逻辑计算偏移即可。
补充说明:你现在分析的是未完成链接的重定位目标文件,汇编里的0地址占位、PLT相关的重定位条目都是链接阶段才会修正的内容,.rodata段里存储的常量、字符串在编译完成时就已经写入目标文件,不会受链接过程影响,直接在.o文件里就能查到完整内容。从你贴的反汇编逻辑看,连续4次都是给
std::cout传.rodata里的char*参数、调用ostream的C字符串输出重载,还原成C++就是连续4行std::cout << "字符串常量";的逻辑。
内容的提问来源于stack exchange,提问作者Troutt025
相关产品推荐
相关产品推荐

