如何在外部目标文件中调用重命名的符号?

How to call a renamed symbol in an external object file?

我正在尝试使用 LLVM libFuzzer 对特定代码片段进行模糊测试,该代码仅在外部公开其 main() 函数。我可以访问目标代码的源代码,但无法更改它。

如果我尝试直接包含目标文件,它会与 -fsanitize=fuzzer 提供的 main 定义冲突。我想我可以通过重命名目标文件中的 main 符号来解决这个问题:

objcopy --redefine-sym main=stub_main main.stub main.o

然后在我的线束代码中,我应该声明:

extern int stub_main(int argc, char **argv)

并调用 stub_main() 而不是 main(),同时在 link 行中包含 main.stub。但是,这似乎不起作用,linker 无法找到对 stub_main(int, char**).

的引用

如何从另一段也提供自己的 main() 的代码中调用此 main 函数?

您没有考虑 C++ 的 name manglingstub_main 的符号可能是一个字符串,其中包含主要内容以及一些关于参数、函数类型和 return 类型的混淆信息。在我的平台上是 __Z9stub_mainiPPcmain 的符号可能只是 mainmain_.

您可以尝试查看 mainstub_main 定义在您的平台中如何与 objdump -d *.o 混淆,然后您可以将这些字符串替换为 objcopy --redefine-sym.

或者,如 matoro 所说,您可以将函数声明为 extern "C",这样就不会发生名称修改。