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

时间:2018-11-29 22:26:35

标签: c object clang llvm debug-symbols

我有一个目标文件(无法访问源文件)。

出于充分的原因,我需要复制一个呼叫路径。例如,此目标文件可能具有以下符号:

_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

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题