【问题标题】:What is the difference between .rodata and .rdata.rodata 和 .rdata 有什么区别
【发布时间】:2021-04-21 00:55:29
【问题描述】:

我已经看到 .rodata.rdata 都被用作分段。我应该使用哪一个,它们之间有什么区别?

【问题讨论】:

  • 取决于目标文件格式。
  • Windows PE 格式
  • 在 Windows 上使用 .rdata,在 Linux/Unix 系统上使用 .rodata(至少在 ELF 对象文件中,关于 MacOS Mach-O 的 IDK)。
  • 所有重要的是文件的使用者,如果使用者是加载二进制文件以在操作系统(可能是版本)上执行的软件,那么你会想要遵守它。如果您正在制作自己的工具来消费或不在乎(例如裸机),那么至少使用 gnu 工具将名称更改为您想要的任何名称都是微不足道的 .bob、.ted、.foo、.bar...
  • 为该消费者使用现有(工作)工具,看看这些工具生成和使用什么。一旦你知道这行得通,你当然可以试验一下,看看另一种形式是否也行得通。

标签: assembly portable-executable segment readonly-variable


【解决方案1】:

RODATA 用于ELFRDATA 用于COFFMach-O 中最接近的等价物是 __TEXT,__const

【讨论】:

    【解决方案2】:

    .rodata 和 .rdata 有什么区别

    主要(唯一?)区别在于文化。

    对于链接器和加载器(以及目标文件格式),您可以使用任何您喜欢的名称。只要(在链接期间)应该在同一节中的内容对该节使用相同的名称,并且该节的属性得到充分描述(例如,使用链接器脚本,包括用于操作系统)。如果您愿意处理额外的麻烦,也没有什么可以阻止您拥有多个单独的部分(例如,可能使用“rdata_initialization”、“rdata_frequently_used”和“rdata_rarely_used”来提高缓存局部性)。

    但是,为方便起见(鉴于大多数人不会对节做任何特殊处理),为确保工具对同一节使用相同的名称,编译器会使用特定操作系统的“正常”名称作为默认值,并将假设 Windows 为“.rdata”(因为这对于 Windows 来说是正常的),而 *nix 克隆是“rodata”(因为这对于 Unix 来说是正常的)。

    【讨论】:

    • rodata 不是意味着“只读”吗?如果你有一个字符串(“hello world”),那不是代码,而是数据。但它的数据并不意味着可写。鉴于某些架构支持将内存页面标记为可读/可写/可执行,包含不打算修改的数据的页面可以进入“只读”页面。
    猜你喜欢
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多