".rodata"和".rdata"之间有什么区别?

3
我曾看到过使用.rodata.rdata两个段的情况。应该使用哪一个并且它们之间有什么区别?

1
这取决于目标文件格式。 - fuz
Windows PE 格式 - Ark
1
在Windows上使用.rdata,在Linux/Unix系统上使用.rodata(至少在ELF目标文件中是这样,我不确定MacOS Mach-O是否也是如此)。 - Peter Cordes
重要的是文件的使用者。如果使用该文件的是一个将二进制文件加载到操作系统(或许还有版本)中执行的软件,那么你需要遵守该软件的规范。如果你正在开发自己的工具或不关心这个问题(比如在裸机环境下),那么至少使用GNU工具可以轻松地更改名称为任何你想要的.bob、.ted、.foo、.bar等。 - old_timer
使用现有(可用)的工具来为该消费者生成内容,并使用这些工具所生成的内容。一旦你知道这种方法是有效的,你可以尝试进行实验,看看其他形式是否也有效。 - old_timer
当您尝试使用这些形式时,发生了什么? - old_timer
2个回答

4

RODATA 被用于 ELFRDATA 被用于 COFF。在 Mach-O 中最接近的相等标识为 __TEXT,__const


2
.rodata和.rdata之间的主要(唯一?)区别在于文化差异。
对于链接器和加载器(以及目标文件格式),您可以使用任何您喜欢的名称。只要在链接期间应该位于同一部分的内容使用相同的部分名称,并且充分描述了该部分的属性(例如使用链接器脚本,包括操作系统的默认链接器脚本),则不重要。如果愿意处理额外的麻烦,还没有什么阻止您拥有多个单独的部分(例如“rdata_initialization”,“rdata_frequently_used”和“rdata_rarely_used”以提高缓存局部性)。
然而,为方便起见(考虑到大多数人不对部分进行任何特殊处理),为确保工具使用相同的名称用于相同的部分,编译器使用某个操作系统的“正常”作为默认值,并假定Windows为“.rdata”(因为这对于Windows来说是正常的),*nix克隆使用“rodata”(因为这对于Unix来说是正常的)。

“rodata”不是意味着“只读”吗?如果你有一个字符串(“hello world”),那不是代码,所以它是数据。但这是一种不可写的数据。鉴于某些架构支持将内存页面标记为可读/可写/可执行,包含不应修改的数据的页面可以放在“只读”页面中。 - David Wohlferd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接