Проблема с компиляцией плагина 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>