代码之家  ›  专栏  ›  技术社区  ›  VP.

在.text节中定义只读数据的原因是什么?

  •  3
  • VP.  · 技术社区  · 6 年前

    我正在学习汇编和低级编程本身,并阅读 book about it 是的。据说我们可以把任何数据放在 。文本 一段 精灵 文件,但由于页/段的权限不同,我们当然不能对其进行更改。但没有人告诉他,为什么会有数据在里面 。文本 章节。很多C++程序员也告诉我,G++编译器把

    static const char DATA[] = "SOME DATA";
    

    在里面 。文本 我也是。我想知道,为什么不把这些数据放进去 .罗达塔 节,目的是什么?如果 。文本 是用过的,放在 .罗达塔 那么呢?

    主要的问题是这种长期行为。

    1 回复  |  直到 6 年前
        1
  •  8
  •   fuz    6 年前

    传统上,只读数据放在文本部分有两个原因:

    • 文本部分是不可写的,因此内存保护会捕获对只读数据的意外写入,从而使程序崩溃
    • 使用内存管理单元(MMU),同一进程的多个实例可以共享文本段的一个副本(因为它保证在程序的所有实例中都是相同的),从而节省内存。

    在elf目标上,这个方案做了一些修改。只读数据现在放置在新的 .rodata 类似于 .text 除此之外的部分也无法执行,以防止某些攻击向量。优势依然存在。