Использование плагинов gcc с кросс-компилятором, неопределенный символ
Я пытаюсь понять, можно ли использовать плагин gcc в кросс-компиляторе ARM (arm-none-eabi-gcc). Однако я сталкиваюсь с ошибками компилятора и задаюсь вопросом, возможно ли то, что я пытаюсь сделать.
Плагин, который я пытаюсь настроить: https://github.com/vanhauser-thc/AFLplusplus/tree/master/gcc_plugin
Я компилирую плагин на x86-64 linux, используя -m32
флаг, поскольку кросс-компилятор является 32-битным приложением. Однако, когда я пытаюсь использовать плагин в кросс-компиляторе, используя-fplugin
, Я получаю ошибку компилятора неопределенного символа:
cc1plus: error: cannot load plugin ../afl-gcc-pass.so
../afl-gcc-pass.so: undefined symbol: _Z13build_int_cstP9tree_nodel
Я просмотрел символы плагина, используя nm
и обнаружил, что большинство символов не определены, в том числе такие, как exit
а также random
. Я новичок в большей части этого и не уверен, что это на самом деле означает. Некоторые поисковые запросы в Интернете предположили, что это могло быть связано с неправильными путями к библиотекам, но установкаLIBRARY_PATH
а также LD_LIBRARY_PATH
и восстановление, похоже, не помогло.
Настройки версии gcc, которые я пробовал:
1: x86: 5.4.0, arm: 5.4.1 в ubuntu 16.04
2: x86: 5.2.0, arm: 5.2.1 в CentOS 6.8
Можно ли использовать подключаемый модуль gcc в другом gcc, чем он был скомпилирован, или я зря трачу время?
1 ответ
Да, можно создать плагин gcc с данным компилятором, а затем использовать плагин в другом компиляторе (включая кросс-компилятор), но вы должны убедиться, что вы включаете правильные файлы заголовков при создании плагина. В частности, вы должны включить файлы заголовков разработки плагинов целевого компилятора, а не файлы заголовков основного компилятора. Каталог, в котором находятся файлы разработки плагинов для вашего целевого компилятора, можно получить с помощью следующей команды:
$(TARGET_CC) -print-file-name=plugin
где $(TARGET_CC)
ваш целевой компилятор. Таким образом, краткий способ указать соответствующий каталог include во флагах компилятора при создании плагина будет выглядеть примерно так:-I"$(shell $(TARGET_CC) -print-file-name=plugin)/include"
.
Для конкретного плагина, который вы пытаетесь использовать (инструментарий для afl-fuzz), чтобы построить плагин для вашего кросс-компилятора, вы можете изменить Makefile в папке gcc_plugin; более конкретно, вы можете определитьTARGET_CC
переменная, содержащая путь к вашему кросс-компилятору, а затем замените $(CC)
с $(TARGET_CC)
в определении PLUGIN_FLAGS
, как в:
PLUGIN_FLAGS = -fPIC -fno-rtti -I"$(shell $(TARGET_CC) -print-file-name=plugin)/include"
Вам также нужно будет закомментировать команды, выполняемые в test_build
Цель Makefile, потому что эти команды будут пытаться использовать плагин с собственным компилятором и поэтому потерпят неудачу. Затем вы сможете использовать плагин с кросс-компилятором, как показано ниже:
arm-none-eabi-gcc -fplugin=../afl-gcc-pass.so --specs=nosys.specs my_source_file.c