Gcc 工具到";联合国定义;可重定位ELF符号表中的符号

Gcc 工具到";联合国定义;可重定位ELF符号表中的符号,gcc,llvm,ld,elf,binutils,Gcc,Llvm,Ld,Elf,Binutils,是否有任何实用程序修补ELF符号表中的任意符号,以便定义的符号变为未定义的符号?例如,这里是我要处理的文件的readelf--syms Symbol表'.symtab'包含8个条目: Num:值大小类型绑定到Ndx名称 0:0000000000000000 0不键入本地默认值 ... 5:0000000000000000 13 FUNC弱默认值3我的_消息 6:0000000000000000 19 FUNC全局默认值5打印消息 7:0000000000000000不键入全局默认值 这里是未定

是否有任何实用程序修补ELF符号表中的任意符号,以便定义的符号变为未定义的符号?例如,这里是我要处理的文件的
readelf--syms

Symbol表'.symtab'包含8个条目:
Num:值大小类型绑定到Ndx名称
0:0000000000000000 0不键入本地默认值
...
5:0000000000000000 13 FUNC弱默认值3我的_消息
6:0000000000000000 19 FUNC全局默认值5打印消息
7:0000000000000000不键入全局默认值
这里是未定义
my_message
的相同二进制文件的预期输出:

Symbol表'.symtab'包含8个条目:
Num:值大小类型绑定到Ndx名称
0:0000000000000000 0不键入本地默认值
...
5:0000000000000000不键入全局默认值和my_消息
6:0000000000000000 19 FUNC全局默认值5打印消息
7:0000000000000000不键入全局默认值
ELF文件本身是可重定位的。修改应该只改变符号表。包含原始符号定义的实际部分应保持不变。 我已经检查了GNUBINUTILS和
objcopy
可能是我正在寻找的,但到目前为止,我还没有找到任何选项(或组合)来提供上述行为


事实上,这样的工具应该足够简单,可以实现(即使没有像BFD这样的额外库),但我想知道是否有一些现有的东西我可能会错过。

您可以看看库的“匿名化”示例。该示例替代符号的名称。可以类似地实现对符号类型的重写。但需要处理“.symtab”部分


不完全是工具,而是一个允许实现此类工具的库。

您希望通过取消定义符号来实现什么?内部调用可能不会因此被重定向。@FlorianWeimer我计划强制链接器忽略一个对象文件中的某些定义,以便从其他位置解析它们。正如您所说,这可能不适用于非全局符号,因为编译器可能会发出这样的重新定位,链接器稍后无法将其转换为跳转槽或GET条目(因此无法重定向到外部DSO)。但另一方面,gABI将
GLOBAL
符号定义为可抢占的,这意味着它们最终通过专用跳槽或GET条目被引用。因此,应该可以“取消定义”它们,并从其他动态库获取另一个定义。编译器可能已经创建了本地别名,然后链接编辑器将在本地解析该别名。LTO和
-fno语义插入都会发生这种情况。对,
*。localalias.0
都是
本地的
,所以我提到的方法在这里不起作用。无论如何,如果可以创建或不创建本地别名,这是用户控制的行为。所以这对我的项目来说应该是可管理的。而且它看起来只有GCC支持
-fno语义插入
,而我的目标编译器是Clang,它对此一无所知。顺便说一句
-fno语义插入
看起来有些多余,因为
STV_PROTECTED
以一种与工具链无关的方式提供了完全相同的语义。此外,IMO,
-fno语义插入
违反了gABI,因为它将
全局
硬连线到二进制文件中导出,而不允许用户抢占它,更重要的是,与
受STV_保护的
不同,它无法通过检查剥离的可加载二进制文件来猜测这一点。