【问题标题】:GCC plugin compilation issueGCC插件编译问题
【发布时间】:2020-09-22 00:28:18
【问题描述】:

我正在尝试交叉编译自定义内核模块 (from this git), 这取决于最初在 git 中编译的插件(它在 $git/buildtools/gcc-nexmon-plugin/nexmon.c 中)。

本来这个树是打算直接建在树莓派上的,但是我想把这个特性移植到一个buildroot系统上,也就是我的树莓派上没有gcc/g++,我只跨- 在我的笔记本电脑上编译。

我的问题是如何正确创建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..”)。

现在我知道插件不应该被交叉编译。请记住,他们希望我们在树莓派上运行它,所以“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,并且我找到了相应的插件开发头文件。如果我运行这个,我会遇到一吨的问题,

  • “在包含的插件/include/tree.h 文件中:#error Unknown BITS_PER_UNIT”
  • “在包含的插件/include/cpplib.h 文件中:#error 找不到至少 32 位有符号整数类型”

这让我觉得我缺少一些标志来正确定义我的笔记本电脑架构 - 但我可能错了。

这是我的错误的完整 PasteBin:output log

我想我确实有构建插件的东西,因为 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 升级都删除了它们,它们不再使用了

任何帮助都将受到高度赞赏,到目前为止,没有人能够帮助我,我的想法已经用完了。这一点完全阻碍了我的项目。

【问题讨论】:

    标签: gcc cross-compiling gcc-plugins


    【解决方案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> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 2016-07-19
      • 2010-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      相关资源
      最近更新 更多