gpt4 book ai didi

linux - 为 busybox 构建选择正确的内核头文件

转载 作者:太空宇宙 更新时间:2023-11-04 11:05:52 24 4
gpt4 key购买 nike

在构建 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/sys-include,然后再搜索/opt/snakede/sparc-snake-linux/include,但是/opt/snakede/sparc-snake-linux/include下的文件是无论如何首先选择。所以插入了许多#ifndef BUSYBOX 守卫,以便第二个定义被编译阻止。被阻止的行大多在 sys-include 目录下。我想知道这是否是一个允许的方法(只是阻止第二个定义)或者是否有另一种更好的、定义明确的方法来应对这种情况(就像我应该阻止第一个定义——主要来自 gcc 包含头文件- 并使用 sys-include 目录下的文件,这些文件适用于目标系统)编辑:使用#ifndef BUSYBOX 我阻止了 20 多个第二次出现的定义,但仍然看到此类错误。我不知道这是否是正确的方法。

最佳答案

几天后,我发现 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 之前工作得很好,所以在 ver 2.6 之后添加的头文件应该手动复制到新的头文件目录。 (主要是 linux/xx.h asm-generci/xx.h asm/xx.h。我什至不得不从 sys-include 文件的相应部分复制新 header 中缺少的一些定义。希望对您有所帮助!

关于linux - 为 busybox 构建选择正确的内核头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25307454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com