为什么要在 PE 文件中创建不同的 code/data/bss 部分?

Why would one want to create a different code/data/bss section in a PE file?

作为对可执行文件格式有粗略了解的人,我发现 MSDN 文档中的以下 #pragma 指令非常有趣:

将某些变量和函数体放在 PE/OBJ 文件中与默认部分不同的 .section 中究竟有什么好处?

嗯,传统上文字是常量(例如 static const char* const = "hello world";),部分原因是它们位于 const_seg 区域,如果它们位于 data_segbss_seg 它们可以是可变的(尽管出于显而易见的原因不能就地调整大小)。

另一个原因(同样)可能是在编译时预初始化复杂的数据结构,但允许在运行时对其进行操作,例如已知值的大型哈希表,尽管这需要编译器支持。

changing segment多用于嵌入式软件中,将一些数据映射到各个物理存储区域。例如,您可能希望将一些变量保存在 EEPROM 中,在这种情况下,您可以定义一个特殊的段以在 link 时间映射到 EEPROM 地址。

对于 WIN32 可执行文件,它的用途有限。您可能希望使用它在进程的各个实例之间共享一些内存,但如果您试图篡改内存映射,您最好知道自己在做什么。