我有一个目标文件(无法访问源文件)。
出于充分的原因,我需要复制一个呼叫路径。例如,此目标文件可能具有以下符号:
_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
?
有更好的方法吗?
答案 0 :(得分:1)
我找到的解决方案是编写一个LLVM Pass共享模块,该模块可以插入LLVM的优化器工具,该工具接收一个字节码对象并输出一个字节码对象。
http://llvm.org/docs/WritingAnLLVMPass.html
LLVM传递是可以创建的自定义优化器,在其中可以使优化器循环所有函数符号,并根据需要对其重命名,并更新对该函数的所有引用。