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

What is the reason for having read-only data defined in .text section?

本文关键字:是什么 数据 只读 text 定义      更新时间:2023-10-16

我正在学习汇编和低级编程本身,并阅读一本关于它的书。据说我们可以将任何数据放在elf文件的.text部分中,但当然我们不能因为页面/段的权限不同而改变它。但是那里没有被告知,它的原因是什么,在.text部分内有数据。许多C++程序员也告诉我,g++ 编译器把

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

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

主要问题是关于长模式下的这种行为。

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

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

在ELF目标上,这个方案被修改了一点。 只读数据现在放置在新的.rodata部分中,该部分与.text部分类似,只是它也无法执行,从而防止某些攻击媒介。 优势依然存在。

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

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