首页 文章

为busybox build选择正确的内核头文件

提问于
浏览
0

在构建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中定义 . 运用
echo“”| 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 include头文件) - 并使用sys-include目录下的文件,这些文件适用于目标系统 . 编辑:使用#ifndef BUSYBOX我阻止了超过20个第二次出现的定义,我仍然看到这样的错误 . 我不知道这是不是正确的做法 .

1 回答

  • 0

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

相关问题