【问题标题】:selecting right kernel header files for busybox build为busybox构建选择正确的内核头文件
【发布时间】:2014-08-14 11:54:27
【问题描述】:

在构建busybox 时,我发现一些源文件包含Linux 内核头文件。 我添加了#define __KERNEL__ 来选择头文件行的某些部分。我还添加了#define _BUSYBOX_ 并在内核头文件中插入了#ifndef _BUSYBOX_ 以便编译器不会选择某些特定部分。(我不知道这是正确的方法)
我面临的下一个问题如下。它说 fd_set 定义了两次。

In file included from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/thread_info.h:10:0,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/preempt.h:9,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/spinlock.h:50,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/mmzone.h:7,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/gfp.h:4,
                 from /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/slab.h:12,
                 from archival/libarchive/unxz/xz_private.h:16,
                 from archival/libarchive/unxz/xz_dec_bcj.c:11,
                 from archival/libarchive/decompress_unxz.c:36:
/opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/sys-include/linux/types.h:23:26: error: conflicting types for 'fd_set'
/opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/../../../../sparc-snake-linux/include/sys/select.h:75:5: note: previous declaration of 'fd_set' was here

消息显示 fd_set 首先在 sparc-snake-linux/include/sys/select.h 中定义,然后在 sparc-snake-linux/sys-include/linux/types.h 中再次定义。使用
回声"" | sparc-snake-linux-gcc -o /tmp/tmp.o -v -x c -
我可以看到默认的包含路径是

#include <...> search starts here:
 /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/include
 /opt/snakede/lib/gcc/sparc-snake-linux/4.6.2/include-fixed
 /opt/snakede/sparc-snake-linux/sys-include
 /opt/snakede/sparc-snake-linux/include

它首先在 /opt/snakede/sparc-snake-linux/include 之前搜索 /opt/snakede/sparc-snake-linux/sys-include 但 /opt/snakede/sparc-snake-linux/include 下的文件是反正先选了。因此插入了许多#ifndef BUSYBOX 保护,以便第二个定义被编译阻止。被阻止的行主要在 sys-include 目录下。我想知道这是否是一种允许的方法(只是阻止第二个定义)或者对于这种情况是否有另一种更好、定义明确的方法(就像我应该阻止第一个定义——主要来自 gcc 包含头文件- 并使用 sys-include 目录下的文件,这些文件适用于目标系统) 编辑:使用 #ifndef BUSYBOX 我阻止了 20 多个第二次出现的定义,并且仍然看到此类错误出现。我不知道这是否是正确的方法。

【问题讨论】:

    标签: linux gcc makefile include busybox


    【解决方案1】:

    几天后,我发现linux内核头文件是为linux构建定义的,所以一些定义与用户定义冲突。所以我们需要使用用户程序可以使用的'cleaned header'。为此,我跑了
    '使 ARCH=.. CROSS_COMPILE=.. headers_install INSTALL_HDR_PATH=..
    这个新的 linux 头文件应该替换 sparc-snake-linux/sys-include 目录。顺便说一句,这个“make headers_install”在 linux2.6 之前运行良好,所以在 2.6 之后添加的头文件应该手动复制到新的头文件目录中。 (主要是 linux/xx.h asm-generci/xx.h asm/xx.h。我什至不得不从 sys-include 文件的相应部分复制新头文件中缺少的一些定义。 希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-02
      • 2015-11-14
      • 2022-10-17
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多