Как вызвать переименованный символ во внешнем объектном файле?
Я пытаюсь выполнить фаззинг определенного фрагмента кода с помощью LLVM libFuzzer, который предоставляет только его
main()
функционируют внешне. У меня есть доступ к источнику целевого кода, но я не могу его изменить.
Если я попытаюсь напрямую включить объектный файл, он конфликтует с
main
определение, предоставленное
-fsanitize=fuzzer
. Я думал, что смогу решить эту проблему, переименовав
main
символ в объектном файле:
objcopy --redefine-sym main=stub_main main.stub main.o
Затем в моем коде привязи я должен просто объявить:
extern int stub_main(int argc, char **argv)
И позвони
stub_main()
вместо
main()
, включая
main.stub
на линии связи. Однако это не сработало, и компоновщик не может найти ссылку на
stub_main(int, char**)
.
Как я могу это назвать
main
функция из другого фрагмента кода, который также предоставляет свой собственный
main()
?
1 ответ
Вы не учитываете искажение имени C++. Символ для
stub_main
Вероятно, это строка, содержащая основную, а также некоторую запутанную информацию об аргументах, типе функции и типе возвращаемого значения. На моей платформе это __Z9stub_mainiPPc. Символ для
main
скорее всего будет просто main или main_.
Вы можете попробовать посмотреть, как
main
и
stub_main
определения искажают вашу платформу с
objdump -d *.o
, а затем вы можете заменить эти строки на
objcopy --redefine-sym
.
В качестве альтернативы, как сказал маторо, вы можете объявить функцию как
extern "C"
так что никакого искажения имени не происходит.