我将如何复制和重命名目标文件中的符号?
How would I duplicate and rename symbols in object file?
我有一个目标文件(我无权访问其源代码)。
出于充分的理由,我需要复制调用路径。例如,此目标文件可能具有以下符号:
_FuncA
_FuncB
_FuncC
_FuncA
调用 _FuncB
,后者又调用 _FuncC
。 FuncC
可能会递增 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 是您可以创建的自定义优化器,在其中您可以让优化器循环遍历所有函数符号并根据需要重命名它们,并更新对该函数的所有引用。
我有一个目标文件(我无权访问其源代码)。
出于充分的理由,我需要复制调用路径。例如,此目标文件可能具有以下符号:
_FuncA
_FuncB
_FuncC
_FuncA
调用 _FuncB
,后者又调用 _FuncC
。 FuncC
可能会递增 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 是您可以创建的自定义优化器,在其中您可以让优化器循环遍历所有函数符号并根据需要重命名它们,并更新对该函数的所有引用。