如何在外部目标文件中调用重命名的符号?
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 mangling。 stub_main
的符号可能是一个字符串,其中包含主要内容以及一些关于参数、函数类型和 return 类型的混淆信息。在我的平台上是 __Z9stub_mainiPPc。 main
的符号可能只是 main 或 main_.
您可以尝试查看 main
和 stub_main
定义在您的平台中如何与 objdump -d *.o
混淆,然后您可以将这些字符串替换为 objcopy --redefine-sym
.
或者,如 matoro 所说,您可以将函数声明为 extern "C"
,这样就不会发生名称修改。
我正在尝试使用 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 mangling。 stub_main
的符号可能是一个字符串,其中包含主要内容以及一些关于参数、函数类型和 return 类型的混淆信息。在我的平台上是 __Z9stub_mainiPPc。 main
的符号可能只是 main 或 main_.
您可以尝试查看 main
和 stub_main
定义在您的平台中如何与 objdump -d *.o
混淆,然后您可以将这些字符串替换为 objcopy --redefine-sym
.
或者,如 matoro 所说,您可以将函数声明为 extern "C"
,这样就不会发生名称修改。