我将如何复制和重命名目标文件中的符号?

How would I duplicate and rename symbols in object file?

我有一个目标文件(我无权访问其源代码)。

出于充分的理由,我需要复制调用路径。例如,此目标文件可能具有以下符号:

_FuncA _FuncB _FuncC

_FuncA 调用 _FuncB,后者又调用 _FuncCFuncC 可能会递增 C 源代码中定义的全局变量 counter

我想修改此目标文件并复制 _FuncA_FuncB_FuncC

结果将是一个具有以下符号的目标文件:

_FuncA _FuncB _FuncC _FuncA_copy _FuncB_copy _FuncC_copy

_FuncA_copy 需要调用 _FuncB_copy,后者又会调用 _FuncC_copy。我需要 _FuncC_copy 仍然引用 相同的 全局变量 counter 并递增它。

我目前有:

似乎 objcopy 命令可以让您使用标志 --add-symbol <name>=[<section>:]<value>[,<flags>] 添加新符号。

这似乎可以帮助我创建 _FuncA_copy_FuncB_copy_FuncC_copy。但是有没有办法把_FuncA_copy里面的函数调用修改成_FuncB转成_FuncB_copy呢?

有更好的方法吗?

我找到的解决方案是编写一个 LLVM Pass 共享模块,该模块可以插入 LLVM 的优化器工具,该工具接收一个字节码对象并输出一个字节码对象。

http://llvm.org/docs/WritingAnLLVMPass.html

LLVM pass 是您可以创建的自定义优化器,在其中您可以让优化器循环遍历所有函数符号并根据需要重命名它们,并更新对该函数的所有引用。