我正在学习汇编和低级编程本身,并正在阅读book about it。据说我们可以在 elf 文件的 .text 部分中放入任何数据,但是由于页面/段的权限不同,我们当然不能对其进行突变。但是那里没有被告知,原因是在 .text 部分中包含了数据。许多C ++程序员还告诉我g ++编译器可以放置
static const char DATA[] = "SOME DATA";
也可以在 .text 部分中。我想知道,为什么不将这些数据放在 .rodata 部分中,目的是什么?如果使用了 .text ,那么在 .rodata 中存储什么?
主要问题是有关长时间模式下的行为。
答案 0 :(得分:8)
传统上,出于以下两个原因,将只读数据放置在文本部分中:
在ELF目标上,对该方案进行了一些修改。现在,只读数据被放置在新的.rodata
部分中,该部分与.text
部分类似,但是它也无法执行,从而阻止了某些攻击向量。优点仍然存在。
答案 1 :(得分:2)
这里说了很多正确的话。我会做一些补充和澄清。
.text
的事实并不意味着我们应该。毕竟,指令和数据只是二进制数。.rodata
、.text
和其他部分主要是实现细节。.rodata
中。但是,在您的情况下,足够小的 const static
字符串在使用时可能会内联到指令流中。字符串本身应该放在 .rodata
中,然后可能会被优化掉,但它的内容被拆分为一些指令,实际上将存储在 .text
中。