Как вызвать переименованный символ во внешнем объектном файле?

Я пытаюсь выполнить фаззинг определенного фрагмента кода с помощью 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" так что никакого искажения имени не происходит.

Другие вопросы по тегам