Использование плагинов g cc с кросс-компилятором, неопределенный символ - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь понять, возможно ли использовать плагин ag cc в кросс-компиляторе ARM (arm-none-eabi-g cc). Однако я сталкиваюсь с ошибками компилятора и задаюсь вопросом, возможно ли то, что я пытаюсь сделать.

Плагин, который я пытаюсь настроить: 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 и перестройка, похоже, не помогли.

Настройки g cc версии I пробовал:

1: x86: 5.4.0, arm: 5.4.1 на Ubuntu 16.04

2: x86: 5.2.0, arm: 5.2.1 на CentOS 6.8

Можно ли использовать плагин ag cc в другом g cc, чем он был скомпилирован, или я трачу свое время?

1 Ответ

1 голос
/ 05 февраля 2020

Да, возможно создать плагин ag cc с данным компилятором, а затем использовать плагин в другом компиляторе (включая кросс-компилятор), но вы должны убедиться, что при сборке вы используете правильные заголовочные файлы. плагин. В частности, вы должны включить заголовочные файлы разработки плагинов компилятора target , а не компилятора хоста. Каталог, в котором находятся файлы разработки плагинов для вашего целевого компилятора, можно получить с помощью следующей команды:

$(TARGET_CC) -print-file-name=plugin

, где $(TARGET_CC) - ваш целевой компилятор. Таким образом, краткий способ указать соответствующий каталог include в флагах компилятора при сборке плагина будет выглядеть примерно так: -I"$(shell $(TARGET_CC) -print-file-name=plugin)/include".

Для конкретного плагина c, который вы пытаетесь использовать (инструментарий для 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
...