为何relocatable object file的data section出现汇编指令而非初始化数据地址?
问题描述
我编写了一个简单的C程序并生成了可重定位目标文件(relocatable object file),以深入了解目标文件的各方面特性,源码如下:
int main(void) { static int a = 1 ; int b = 2 ; b = a + b ; return 0; }
我发现该文件的data section中存在一段汇编指令:
0000000000000000 <a.0>: 0: 01 00 add %eax,(%rax)
而我预期data section应包含初始化数据的地址。我在WSL2 Ubuntu环境下使用gcc,执行命令为gcc -o file.c file.o,请问这一现象的原因是什么?
原因解析
1. 编译命令参数顺序完全错误
你执行的gcc -o file.c file.o搞反了输出与输入的参数逻辑:-o选项的作用是指定输出文件名,它后面必须跟你要生成的目标文件,而非源文件。这条命令实际是让gcc把file.o作为输入,链接生成名为file.c的可执行文件,完全违背了你生成可重定位目标文件的需求。
正确生成可重定位目标文件的命令应该是:
gcc -c file.c -o file.o
其中-c参数告诉gcc只完成编译步骤、不进行链接,最终生成标准的可重定位目标文件file.o。
2. 数据被错误解析为指令
你看到的add %eax,(%rax)指令,本质是把静态变量a的初始化数据当成机器码反汇编了:
- 静态变量
a = 1在x86-64小端模式下,存储的十六进制值是01 00 00 00 - 前两个字节
01 00正好对应x86-64指令集中add %eax,(%rax)的机器码
因为你用错误的命令生成了错误的文件,或错误地对文件进行反汇编操作,才会把data段里的初始化数据当成指令解析,出现不符合预期的结果。
内容的提问来源于stack exchange,提问作者chiheb
相关产品推荐
相关产品推荐

