Проблема с компиляцией плагина GCC

Я пытаюсь скомпилировать собственный модуль ядра (из этого git), который зависит от плагина, изначально скомпилированного внутри git (он находится в $git/buildtools/gcc-nexmon-plugin/nexmon.c).

Изначально это дерево предназначалось для сборки непосредственно на raspberry pi, но я хотел бы перенести эту функцию в систему buildroot, то есть у меня нет gcc/g++ на моем raspberry pi, я компилирую только на мой ноутбук.

Моя проблема в том, как правильно создать nexmon.so (файл плагина), чтобы я мог позже использовать его при кросс-компиляции

Исходная командная строка для создания nexmon.so была:

g++ -std=c++11 -Wall -fno-rtti -fPIC -I../gcc-arm-noneabi[...]/plugin/include \
     -c -o nexmon.o nexmon.c

g++ -shared -o nexmon.so nexmon.o

Как видите, они включают в дерево некоторый кросс-компилятор ("../gcc-arm..").

Теперь я понимаю, что плагин НЕ ДОЛЖЕН подвергаться кросс-компиляции. Помните, они хотят, чтобы мы запустили это на Raspberry Pi, поэтому "g++" - это встроенный "g++". Со своей стороны, я должен запустить "g++" на моем ноутбуке.

К сожалению, я не могу заставить его работать на моем ноутбуке, вот что я пытаюсь сейчас:

g++ -std=c++11 -Wall -fno-rtti -fPIC -I/usr/include \
   -I/usr/lib/gcc/x86_64-linux-gnu/8/plugin/include -o nexmon.o -c nexmon.c

Потому что сейчас я использую g++ 8.3.0-6, и я нашел соответствующие заголовки для разработки плагинов. Если я запустил это, у меня будет ТОННА проблем,

  • "во включенном файле plugin/include/tree.h: #error Unknown BITS_PER_UNIT"
  • "во включенном файле plugin/include/cpplib.h: #error Не удается найти хотя бы 32-битный целочисленный тип со знаком"

Это заставляет меня думать, что мне не хватает некоторых флагов, чтобы правильно определить архитектуру моего ноутбука, но я могу ошибаться.

Вот полный PasteBin моих ошибок: журнал вывода

Думаю, у меня есть материал для создания плагина, потому что существует gcc8/plugin/include. Я попытался установить "gcc-Multilib, gcc-8-plugin-dev-i686-linux-gnu, gcc-8-plugin-dev-x86-64-linux-gnux32, gcc-8-plugin-dev". Я не могу вернуться к предыдущему gcc (например, 4.8, 5, 6, 7), потому что все мои обновления debian удалили их, они больше не используются

Любая помощь будет принята с благодарностью, пока никто не смог мне помочь, и у меня закончились идеи. Этот момент полностью блокирует мой проект.

1 ответ

Я отвечаю на свой вопрос, потому что это может помочь людям в будущем

Во-первых, я ошибался в том, как скомпилировать плагин для последующего использования в контексте кросс-компиляции, правильный способ сделать это:

$(HOST_CXX) -fPIC -I$(TARGET_CC)/[..]/plugin/include -shared \
     -o plugin.so plugin.c

Поэтому вы не выполняете кросс-компиляцию, а вызываете среду разработки плагинов вашего кросс-компилятора. Чтобы определить правильный путь включения, просто выполните:

$(TARGET_CXX) -print-file=plugin

Мои проблемы с компиляцией были связаны с тем, что этот плагин был построен для более старой версии gcc (5+), а я использую (8+). Мое исправление - заменить следующую строку:

#include <plugin.h> 

(Я предполагаю, что это был старый способ вызова среды разработки плагинов):

#include <gcc-plugin.h> 
Другие вопросы по тегам