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

时间:2018-06-26 11:58:57

标签: c++ assembly

我正在学习汇编和低级编程本身,并正在阅读book about it。据说我们可以在 elf 文件的 .text 部分中放入任何数据,但是由于页面/段的权限不同,我们当然不能对其进行突变。但是那里没有被告知,原因是在 .text 部分中包含了数据。许多C ++程序员还告诉我g ++编译器可以放置

static const char DATA[] = "SOME DATA";
也可以在 .text 部分中

。我想知道,为什么不将这些数据放在 .rodata 部分中,目的是什么?如果使用了 .text ,那么在 .rodata 中存储什么?

主要问题是有关长时间模式下的行为。

2 个答案:

答案 0 :(得分:8)

传统上,出于以下两个原因,将只读数据放置在文本部分中:

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

在ELF目标上,对该方案进行了一些修改。现在,只读数据被放置在新的.rodata部分中,该部分与.text部分类似,但是它也无法执行,从而阻止了某些攻击向量。优点仍然存在。

答案 1 :(得分:2)

这里说了很多正确的话。我会做一些补充和澄清。

  • 我们可以将常量数据放入.text的事实并不意味着我们应该。毕竟,指令和数据只是二进制数。
  • 这也不意味着现代编译器(总是)这样做。
  • .rodata.text 和其他部分主要是实现细节。
  • 确实,大块的 const 数据通常存储在 .rodata 中。但是,在您的情况下,足够小的 const static 字符串在使用时可能会内联到指令流中。字符串本身应该放在 .rodata 中,然后可能会被优化掉,但它的内容被拆分为一些指令,实际上将存储在 .text 中。