可执行文件(目标文件)的格式:
在 Windows 下都按照 PE-COFF 格式存储,Linux 下按照 ELF 格式存储。
程序源代码被编译后主要分为两种段:程序指令和程序数据。
代码段属于程序指令,而数据段和 .bss 段属于数据段。
- .data 段保存的是已经初始化了的全局变量和局部静态变量。
- .rodata 段保存的是只读数据,一般是程序里面的只读变量和字符串常量。
- .bss 段保存的是未初始化的全局变量和局部静态变量。
static int x1 = 0;
// x1 为 0,可以认为 x1 未被初始化(缺省值为 0),存放在 .bss 中
// 这样可以节省空间,因为 .bss 不占磁盘空间
static int x2 = 1;
// x2 存放在 .data 中
想要代码或者变量放到指定段中,采用:
__attribute__((section("FOO"))) int val = 1;
__attribute__((section("BAR"))) void fun() {
}