You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:53:13