ELF文件中的数据段和数据1段有什么区别?只读数据段和只读数据1段又有什么区别?

5
3个回答

2
我没有找到任何强制执行这一点的单个文件,但是.rodata1通常在以.rodata开头的所有内容之后出现。您可以查看系统上的链接器脚本以验证此内容(通常为/usr/lib/ldscripts/)。
这使得一些很好的事情成为可能,例如将校验和变量放置在此部分中。这确保了它位于其余的只读内容之后,工具可以计算校验和并将其修补到二进制文件中。
在运行时,您可以根据校验和检查代码。对于PC来说,这听起来很愚蠢,但在嵌入式固件中很常见。 我猜这个部分的动机是为了拥有一个“在”编译器生成的代码之外的部分,出于各种原因,但从未完全记录下来。

1
我知道它们是相同的。这也取决于编译器。一些编译器会将这两个(甚至更多)部分连接成“.data”。

1

通过对binutils-gdb源代码进行一些git考古,看起来:

提交252b5132c753(“19990502 sourceware import”)的差异中提到:

+Fri Jul 23 13:51:09 1993  Ken Raeburn  (raeburn@cambridge.cygnus.com)
+
+       * scripttempl/elf.sc: Add support for .init, .fini, .ctors,
+       .dtors, .data1, .rodata1 sections, instead of combining them into
+       other sections.  For `-r', set all section start addresses to
+       zero.

这是我找到的最早参考资料。我怀疑binutils在那时被嫁接到gdb的源代码中。我似乎找不到26年前存在的预导入源代码。他们的邮件档案似乎从1999年开始。在他们的错误跟踪器中没有关于rodata1的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接