在 .text 部分中定义只读数据的原因是什么?
What is the reason for having read-only data defined in .text section?
我正在学习汇编和低级编程本身,并阅读一本关于它的书。据说我们可以将任何数据放在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
中。
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 在C++中查找像素 RGB 数据的最快方法是什么?
- C++中deque数据结构的大O是什么?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- 将传入的网络"char*"数据转换为"uint8_t"并返回的安全方法是什么?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 自定义数据结构的优点是什么?
- DLL共享数据的推荐方式是什么
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 多维数据集ai中的ai_float是什么
- MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
- 在 .text 部分中定义只读数据的原因是什么?
- 在C++和Python之间交换数据的最快方法是什么?
- 在知道变量是什么数据类型之前如何声明它