当前位置:首页 » 编程软件 » busybox交叉编译

busybox交叉编译

发布时间: 2023-02-12 19:23:54

❶ 真心请教几个关于嵌入式linux系统的问题(满意回答将会追加悬赏,分数虽然没什么意义,略表感谢之情而已)

1.这个内核路径按理说应该是目标系统(编译完成之后的Linux系统)的内核头文件的路径,是这样么?
不对。编译驱动需要的是内核的导出符号表。导出符号表通常在编译好的linux源码根目录下。
那么怎么取得这个内核头文件路径呢?
下载目标板的内核源码,然后进行编译,通过后就得到了所需要的导出符号表。
在交叉编译的时候需不需要添加额外的选项,告诉交叉编译工具要生成内核头文件路径呢?
不需要,这都是Linux内核的Makefile自动完成的。
2.默认添加的文件系统是只读的
Linux启动时候的操作不会受这个只读属性影响,没有写属性并不代表不能写。况且,你得的这个结论不准确。
数据丢失可能是因为数据没有同步到flash或者其他的外存设备。
3.一般来说,是不是交叉编译系统完成之后,需要交叉编译busybox(需要指定内核路径)来获取一系列的utilities呢?
通常不需要,busybox中只有少数与内核结构体相关的命令需要Linux内核源码的目录,大多数的都不需要,这个需要查看编译的输出结果进行确定。如果是只使用基本的命令,不需要Linux内核。
4、最后,想请教下,在移植好的嵌入式Linux系统上能否像PC机上的Linux一样来做开发(除了硬件资源有限,其他的开发思路应该一致)呢?
应用软件可以像pc机一样开发,硬件相关的和内核相关的有很大的不同,比如底层和硬件驱动

sys_path没用过
arm-linux-的前缀是有意义的。busybox通常使用gcc,ar,ld等编译连接工具,为了和宿主机的工具区分开,需要使用前缀进行区别。仅此而已。

❷ 三、内核&文件系统编译

一、编译官方提供的内核源码

1、解压官方提供的内核源码包

2、根据官方提供的配置文件对内核进行配置,方式如下
make  ARCH=arm      xxxxx_defult_config
cp   arch/arm/xxxxx_config    .config

3、打开图形界面对内核进行配置,根据需要增加或者删除模块和其他内容

4、对内核进行编译
make  ARCH=arm    CROSS_COMPILE=arm-hisiv300-linux-uclibcgnueabi-    uImage  -j6
或者编辑Makefile文件,对其中的ARCH变量和CROSS_COMPILE变量进行修改,然后执行make uImage

5、在编译编译的时候回出现mkimage命令缺失,这个命令是UBootr提供的,在编译的UBoot路径下面找到这个命令,即可直接使用

6、编译的时候各个方面需要一致性,
                1、编译的内核的交叉编译工具链如果支持硬件浮点数运算那么在配置内核的时候也需要添加硬件浮点数的支持
                        Kernel Features --->
                            [*] Use the ARM EABI to compile the kernel
                2、在编译的内核的时候注意保持不要做太多的修改,否则会出问题

7、编译内核模块
    make  ARCH=arm    CROSS_COMPILE=arm-hisiv300-linux-uclibcgnueabi-    moles  -j6

8、安装内核模块到指定的目录中去
make moles_install ARCH=arm CROSS_COMPILE=arm-hisiv300-linux-uclibcgnueabi- INSTALL_MOD_PATH=/home/fu/hisi/kernel/build

9、不要采用内核模块安装的命令来安装内核,因为内核不需要安装,在arch/arm/boot/uImage就是所需要的内核文件

二、编译官方提供的busybox来构建根文件系统

1、解压需要编译的busybox源码

2、进入源码中对busybox进行配置,主要是配置交叉编译工具链
Busybox Settings --->Build Options ---> 下面有关于busybox是否配置为采用共享库的模式,还有添加交叉编译工具链的前缀

3、配置需要的文件和命令进行添加或者删除

4、然后执行命令make -jn   && make install

5、创建根文件系统需要的其他的文件和目录,在一个空白的目录中首先拷贝busybox/_install下面的bin、sbin、usr目录到空白目录中,在空白目录中创建其余的所需要的目录文件 bin dev etc home lib linuxrc mnt opt proc sbin sys tmp usr var等以上目录

6、接下来在lib目录中复制内核模块,在编译内核的时候模块安装在了指定的地方,直接拷贝过来就行。

6、创建文件系统所需要的其他文件,配置文件(最简单的办法就是直接复制busybox文件下面的example文件夹里面的东西)
1、/etc/inittab     填写或者    一下是最基本的,还有其他的需要填写
# /etc/inittab
::sysinit:/etc/init.d/rcS                    //指定初始化脚本
::askfirst:-/bin/sh                            //指定第一次输入回车后打开的shell
::ctrlaltdel:/sbin/reboot                //指定这三个按键按下后的反应
::shutdown:/bin/umount -a -r        //指定关机是进行的操作

2、/etc/init.d/rcS                //这个就没有详细额硬性规定了,写入需要初始化的东西即可
#!/bin/sh
mount -a

3、/etc/fstab                        //写入mount -a是要自动挂载的文件系统
# device mount-point type options mp fsck order
proc          /proc        proc  defaults        0    0
tmpfs          /tmp        tmpfs  defaults        0    0

7、拷贝需要用到的库文件,在交叉编译工具链下面存放
arm-linux-xxxxxx-gcc/lib
海思的开发板是在和tahet/lib下面,切记。

❸ 交叉编译busybox显示libc.so.6丢失!

拷贝C 库
交叉应用程序的开发需要用到交叉编译的链接库,我们在移植应用程序到我们的目标板的时
候,需要把交叉编译的链接库也一起移植到目标板上,这里我们用到的交叉工具链的路径是
/usr/local/arm/...../,链接库的目录是/usr/local/arm/...../arm-linux/lib,将其中部分库文件及符号链接拷贝到root_nfs(你创建的busybox的根目录)文件夹下的lib文件夹中。
部分库文件及符号链接有:ld-2.3.2.so,ld-linux.so.2,libc-2.3.2.so,libc.so.6

❹ 我明明root了,可是还是装不了busybox (手机是魅族,用自带root)

首先我要告诉你,root过后,并不代表,获取了权限。需要获取控制权限的软件APP。必须在,root里面,设置通过权限设置。才能正常使用该软件的APP。如果你没有授权的话,该软件还是无法正常使用的。

❺ 如何利用busybox制作根文件系统

选定 busybox-1.9.2.tar.bz2 这个版本, 以静态方式编译, 即生成的 busybox 不需要共享库的支持就能运行。这样做我们就不需要布署程序库了。缺点是自己写的 arm-linux 程序在这个根文件系统中是不能运行的,因为缺少共享程序库的支持。不过不用担心,通过在目标机里以挂接 NFS 的方式, 将宿主机的 arm-linux-gcc 编译器的库文件挂到 arm-linux 的 /lib 下, 就可完美的运行我们自己的程序了。
现在开始制作静态链接库的根文件系统。

1、准备根文件系统
首先准备制作工具BusyBox1.9.2。
准备交叉编译工具arm-linux-gcc 3.3.2。
在机器上建立rootfs的文件夹
#mkdir rootfs
在rootfs中建立linux系统中典型的文件夹
#cd rootfs
#mkdir root home bin sbin etc dev usr lib tmp mnt sys proc
#mkdir usr/lib usr/bin
#pwd
/home/su/rootfs
2、解压源码包
#tar xjf busybox-1.9.2.tar.bz2
#cd busybox-1.9.2
3、修改 Makefile,
#vi Makefile
将Makefile中的
CROSS_COMPILE ?=
改为
CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-
注:这个版本的 busybox 用 3.4.1 的 arm-linux-gcc 编译有些问题, 用 3.3.2 版则可顺利编译。
4、定制 busybox
选择busybox下全部的可执行程序
#make defconfig
进到配置选项
#make menuconfig
设置静态编译方式
Busybox Settings ---> Build Options ---> [*] Build BusyBox as a static binary (no shared libs)
Busybox Settings ---> Install Options ---> 中输入建立根文件系统的文件所在的路径/home/su/rootfs。
其它的默认。
确保 [*] Build BusyBox as a static binary (no shared libs) 被选中,保存退出
5、执行 make 编译
#make
编译出错, 信息如下:
applets/applets.c:15:2: warning: #warning Static linking against glibc proces buggy executables
applets/applets.c:16:2: warning: #warning (glibc does not cope well with ld --gc-sections).
applets/applets.c:17:2: warning: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400
applets/applets.c:18:2: warning: #warning Note that glibc is unsuitable for static linking anyway.
applets/applets.c:19:2: warning: #warning If you still want to do it, remove -Wl,--gc-sections
applets/applets.c:20:2: warning: #warning from scripts/trylink and remove this warning.
applets/applets.c:21:2: error: #error Aborting compilation.
make[1]: *** [applets/applets.o] Error 1
按照提示,修改文件 applets/applets.c 第 21 行, 将
#error Aborting compilation.
注释掉:
执行 make 重新编译
#make
编译通过, busybox 被生成了, 然后执行
#make install
busybox 就被安装到指定的路径下了/home/su/rootfs,这时可发现rootfs下多了个liunxrc的文件,bin、sbin下也多了很多文件。用ls –l命令查看其中的一个文件,可发现其是链接到busybox的一个连接符,所以我们之后在目标机上运行的命令大多都会调用busybox这个文件的。
若之前忘了指定路径,默认生成到临时目录busybox-1.9.2/_install 下了。
6、编写配置/etc下的初始化程序(可省略)
最简单的做法是把busybox-1.9.2/examples/bootfloppy/etc下的全部文件拷到目标文件的etc目录下
#cd /home/su/busybox-1.9.2/examples/bootfloppy/etc
#cp –rf * /home/su/rootfs/etc
也可自己写这些文件。
7、把rootfs做成镜像
#mkcramfs rootfs rootfs.cramfs
8、把rootfs.cramfs烧写到目标机中。
9、运行目标机
这时会遇到一个错误信息:
Can’t open tty2
Can’t open tty3
Can’t open tty4
解决办法:把/rootfs/etc/ inittab 文件的第三行“tty2::askfirst:-bin/sh”删除掉。
返回到第7步重做。

现实中,动态编译的方法更适合工程的需要,所以一般是采用动态的方法编译根文件系统的。若选择动态编译的办法,大体方法还是一样的,存在一些不同之处是:
不同之处之一是:
进到配置选项
#make menuconfig
选择动态方式
Busybox Settings ---> Build Options ---> [*] Build Shared libbusybox
不同之处之二是:
上面静态编译出现的出错信息不会出现了,所以不需对程序做任何修改,但还是必须用arm-linux-gcc 3.3.2编译,否则还是会有麻烦。
不同之处之三是(最大的不同之处):
编译完成后,需进到rootfs目录的lib中,往里面添加一些库文件
#cd /home/su/rootfs/lib
这里有点麻烦,我怎么知道需要什么库文件的支持呢?
最简单的办法是把arm-linux-gcc 3.3.2下的整个lib库拷进来,简单省事。但是这么做存在一个问题,做出的根文件系统非常大。
另一个办法是:
#cd /home/su/rootfs/bin
#arm-linux-readelf busybox | grep shared
这样就可以显示出系统运行起来需要什么库文件,再把相应的库文件拷到/home/su/rootfs/lib下。一般而言,系统库用到两个:动态链接器ld-linux.so和c函数库Glibc,Glibc包括:
ld-linux:动态链接库,必需
libc: 标准c函数库,必需
libm: 数学库,一般需要
libdl: 用于动态装载共享库,较少用到
libcrypt: 加密附加库,需要认证的程序用到,较少用
libpthread: POSIX线程库,一般需要
如果需要某个函数库,我们可以将这些库和对应的符号链接拷到目标根文件系统的/lib目录下。简单起见,应该使用-d选项或-a选项调用cp命令,这样可保留完整的符号链接信息。
例:
#cp –a libc.so.6 /home/su/rootfs/lib/
为了减少运行时库的大小,我们应该使用交叉编译版本即arm-linux-gcc 3.3.2的strip工具来处理根文件系统的库文件,把二进制文件中的包含的符号表和调试信息删除掉。
例:
#arm-linux-strip /home/su/rootfs/lib/*.so

注意:
使用busybox做文件系统时,运行make命令,系统会马上显示:
没有/dev/null这个文件
但是还是能最终编译出根文件系统,问题出在重启linux系统,机器进不去了。提示出错,信息如下:
/etc/rc.d/rc.sysinit: line 173:/dev/null: read-only file system
/etc/rc.d/rc.sysinit: line 173:/dev/null: read-only file system
/etc/rc.d/rc.sysinit: line 184:/dev/null: read-only file system
/etc/rc.d/rc.sysinit: line 184:/dev/null: read-only file system
/etc/rc.d/rc.sysinit: line 200:/dev/null: read-only file system
.
.
.
***An error occured ring the file system check.
***Dropping you to a shell;the system will reboot
***when you leave the shell
Give root password for maintenance
(or type Control-D to continue):
解决办法:
按提示输入root用户的密码,回车,可看到
(Repair filesystem)1#:
依次输入命令:
(Repair filesystem)1# mount -n -o remount,rw /
(Repair filesystem)1# rm -f /dev/null
(Repair filesystem)1# mknod -m 0666 /dev/null c 1 3
(Repair filesystem)1# reboot
问题解决。

❻ 编译移植busybox出错,arm-linux-gcc版本4.3.3 busybox版本1.16.0 错误代码如下:

找不到链接库,不这些都是数学库,加参数 -lm 应该就能解决。
但编译过程这个东西应该是自己加。

busybox 一般都是静态的,编译静态程序,很多时候需要他以来的函数库也是静态的。你这个问题应该是编译环境不匹配。你编译了 uclibc 并且正确安装了没?

不过话说,不过是个编译,人家本来就支持 arm ,“移植”这两个字应该是不需要用了。

❼ 如何建立android的C/C++交叉编译环境

因此,构建android上C/C++的交叉编译环境也就成为了一个很大的需求。特别是对于已经取得root权限的机器,如果能直接运行按需编译的二进制文件,那么将可以做很多有意义和有趣的事情。 很不幸,Google没有直接给出如何建立这个交叉编译环境,但是我们可以借助Google提供的强大的NDK (Native Development Tools)来达到这一目的。NDK的本来目标是编译得到.so动态链接库文件,然后通过JNI提供给上层的Java调用,从而实现C/C++程序的简易迁移。而编译.so和编译成二进制可执行文件的过程是完全一样的,这就给了我们可以发挥的空间。 有两种方式获取交叉编译所需的工具链:git下prebuilt这个project或者直接去下载NDK,我这里arm-eabi的版本是最新的4.4.0。1 git clone git://android.git.kernel.org/platform/prebuilt.git 然后创建一个helloworld.c文件。1 2 3 4 5 6 //// root@delleon:~/android/myapp# cat helloworld.c#include int main(){printf("HelloWorld!n");return0;} 接下来创建Makefile文件。注意修改其中的NDK_DIR和SDKTOOL为自己的目录,修改APP为自己的待编译程序主文件名。另外注意自己的arm-eabi的版本,若有变化则也需要修改。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 #### root@delleon:~/android/myapp# cat Makefile APP=helloworld NDK_DIR := ~/android/android-ndk-r4 NDK_HOST := linux-x86 SDKTOOL := ~/android/android-sdk-linux_86/tools TOOLCHAIN_PREFIX :=$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/bin/arm-eabi- CC :=$(TOOLCHAIN_PREFIX)gcc CPP :=$(TOOLCHAIN_PREFIX)g++ LD :=$(CC) COMMON_FLAGS :=-mandroid -ffunction-sections -fdata-sections -Os -g --sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm -fPIC -fvisibility=hidden -D__NEW__ CFLAGS :=$(COMMON_FLAGS) CFLAGS +=-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DSK_RELEASE -DNDEBUG CFLAGS +=-UDEBUG -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -ffunction-sections -funwind-tables -fstack-protector -fmessage-length=0-Bdynamic CPPFLAGS :=$(COMMON_FLAGS)-fno-rtti -fno-exceptions -fvisibility-inlines-hidden LDFLAGS +=--sysroot=$(NDK_DIR)/build/platforms/android-5/arch-arm LDFLAGS +=-Bdynamic -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,noreloc LDFLAGS +=-L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0 LDFLAGS +=-L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/lib/gcc LDFLAGS +=-L$(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.4.0/arm-eabi/lib LDFLAGS +=-nostdlib -lc -llog -lgcc --no-undefined -z $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o $(NDK_DIR)/build/platforms/android-5/arch-arm/usr/lib/crtend_android.o OBJS +=$(APP).o all:$(APP) $(APP):$(OBJS)$(LD)$(LDFLAGS)-o $@$^ %.o:%.c $(CC)-c $(CFLAGS)$

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:748
制作脚本网站 发布:2025-10-20 08:17:34 浏览:1012
python中的init方法 发布:2025-10-20 08:17:33 浏览:718
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:878
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:774
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1127
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:351
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:229
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:911
python股票数据获取 发布:2025-10-20 07:39:44 浏览:875