我说得对吗?在为嵌入式设备制作小型linux系统时,我们需要使用默认工具链基于配置集构建内核。而rootfs需要一个工具链?由于体系结构是在内核中设置的,所以不需要工具链。而忙框生成二进制。因此,它需要一个工具链。请纠正我的疑问。
工具链在嵌入式系统开发中扮演着非常重要的角色。在编译和构建过程中,您还需要特定于您的体系结构的跨工具链。工具链不会是默认的。您必须在配置过程中设置它,或者在传递make命令时指定工具链前缀。
make CROSS_COMPILE=arm-none-linux-gnueabi-
在编译和构建Busybox时应该使用相同的工具链。如果使用编译busybox静态。那么就不用担心共享库了。但如果您使用动态编译busy-box,那么您的工具链在rootfs中扮演着重要角色。在这里,您需要将工具链的库复制到rootfs/lib
文件夹中。
只需键入以下命令就可以知道库需要复制什么。
strings _install/bin/busybox | grep ^lib
显示了应该保存在rootfs的/lib
中的列表库。
这个命令说:"从文件中获取所有字符串,并且只显示以lib开头的行。"无法使用程序ldd,因为该程序已被交叉编译,不会在开发主机。这些文件应该从工具链的sysroot目录中获取。大多数现代工具链已经使用sysroot进行了配置,sysroot是一个包含工具链中文件的目录可能出现在工具链所针对的系统的根文件系统上。检查您的工具链是否sysroot支持,请尝试以下操作:
$ arm-linux-gcc -print-sysroot
/arm未知linux gnueabi/bin/arm linux gcc如果这是一个有效的路径,那么文件应该从这里复制。如果未显示路径,请使用find在中查找sysroot目录,或使用find查找libc.so:
$ find . -name libc.so
找到libc和libm之后,创建(your rootfs)/lib
目录并将它们复制到那里。文件很可能是指向其他文件的符号链接,所以一定要将它们全部收集起来。下一个要获取的文件是动态加载器,通常称为ld-linux-,它也与libc.so.*一起驻留在lib目录中。将其复制到/lib
目录中。您的系统现在拥有所有共享库和加载程序,因此BusyBox可以运行。
因此,最后,如果你想编译任何应用程序或程序,你必须使用这个编译busybox的工具链进行编译。
--sysroot=dir
此选项指定标头和库所在的根目录。当你付出(gcc) -print-sysroot
这将显示相应的gcc(如果是其独立的工具链),以查找该特定目录的标头和库。
当在构建和编译gcc时构建独立的跨工具链时,--sysroot=dir用于查找各自的include和库文件。
你可以在这里看到配置
cd $CLFS_SRC
tar -jxvf gcc-4.7.0.tar.bz2 && mkdir -v gcc-build && cd gcc-build
AR=ar LDFLAGS="-Wl,-rpath,${CLFS_CROSS_TOOLS}/lib"
../gcc-4.7.0/configure --prefix=${CLFS_CROSS_TOOLS}
--build=${CLFS_HOST} --target=${CLFS_TARGET} --host=${CLFS_HOST}
--with-sysroot=${CLFS_CROSS_TOOLS}
通常,此文件夹包含您的所有共享库。
@Shryas,你有一个错误的解释。工具链不过是一个交叉编译器,它对源代码进行交叉编译,这样它就可以在编译的处理器体系结构上运行。甚至内核&bootloader是一个c代码,你想把它移植到嵌入式板上,需要交叉编译,你需要工具链来交叉编译内核&u-boot源。所以需要工具链,它可以是u-boot引导加载程序、内核、rfs(Busybox)和应用程序。