Использование плагинов 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
Другие вопросы по тегам