如何阻止GCC合并共享相同后缀的字符串文字?

Dan*_*iel 5 c gcc elf

GCC似乎在进行优化,将合并了相同后缀的字符串文字组合在一起。

例如,一个包含两个字符串文字"foo bar""bar"可以最终ELF形式结束的C程序(1)将字符串表更改为具有单个字符串文字,"foo bar"以及(2)将该程序更改为将任何指针"bar"都转换为现在指向的4字符入弦"foo bar"。请注意,从仅向前读取C程序的角度来看,第二个文字仍然看起来像"bar"

虽然我认为这是一种压缩字符串集合而不增加ELF文件格式复杂性的聪明方案,但是出于深奥的原因,这也给我带来了麻烦(在后期处理ELF文件并对其进行各种分析时)。如何关闭GCC的此功能?

Flo*_*mer 7

ELF字符串表是由汇编器和链接编辑器构建的,因此它不是GCC问题,而是与binutils相关的。字符串表合并是在binutils 2.26中引入的:

例如在构建powerpc64内核模块时,这会引起偶然的问题。

不幸的是,我不知道一种在基于BFD的链接器(ld.bfd)中禁用字符串表合并的方法。

但是,gold(ld.gold也是binutils的一部分)仅在优化时执行字符串表合并(-O2或更高;请注意,这是一个链接器标志)。如果binutils汇编程序合并了字符串表项,它将再次复制它们。这意味着,如果您的项目与gold链接程序兼容,则可以使用它来解决此问题。