在Linux系统的程序开发和编译场景中,obj是英文object的缩写,通常指的是目标文件(Object File),是源代码经过编译处理后生成的中间文件,还没有经过链接步骤,无法直接运行。

obj文件的生成过程
Linux下程序的编译通常分为预处理、编译、汇编、链接四个步骤,obj文件就是在汇编阶段生成的产物。以C语言程序为例,当我们编写好源码文件test.c后,执行以下命令就可以生成对应的obj文件:
# 预处理、编译、汇编生成目标文件,默认生成test.o gcc -c test.c # 指定输出目标文件名 gcc -c test.c -o my_test.obj
这里的.o后缀和.obj后缀都是Linux下常见的目标文件后缀,二者含义完全一致,只是不同场景下的命名习惯差异。
obj文件的结构特性
Linux下的obj文件大多遵循ELF(Executable and Linkable Format)格式,内部主要包含以下几部分内容:
- 文件头:记录文件的类型、机器架构、入口地址等基本信息
- 段表:描述文件中各个段的位置、大小等属性
- 代码段:存放编译后的机器指令
- 数据段:存放全局变量、静态变量等数据
- 符号表:记录文件中定义和引用的符号信息,是链接阶段的重要依据
obj文件的作用
obj文件是链接阶段的输入文件,链接器会将多个obj文件以及所需的库文件整合,处理符号引用关系,最终生成可执行文件或者动态库、静态库。我们可以通过objdump工具查看obj文件的内容,比如查看代码段的反汇编结果:
# 查看test.o的代码段反汇编内容 objdump -d test.o
也可以通过readelf工具查看obj文件的ELF格式详细信息:
# 查看test.o的ELF头信息 readelf -h test.o # 查看test.o的符号表 readelf -s test.o
常见误区说明
需要注意,obj并不是Linux系统特有的概念,在Windows的编译过程中也会生成目标文件,只是Windows下目标文件后缀通常为.obj,而Linux下更常用.o后缀,二者本质都是编译后的中间目标文件,只是格式可能存在差异,Windows的目标文件通常遵循COFF格式而非ELF格式。
另外,不要将obj文件和/proc目录下的进程相关对象混淆,/proc下的obj相关表述通常指内核中的对象结构,和编译过程中的目标文件是完全不同的概念。