我是否正确,在为嵌入式设备制作小型 Linux 系统时,我们需要基于使用默认工具链的配置集构建内核。而 rootfs 需要工具链?由于架构是在内核中设置的,因此不需要工具链。而忙碌的盒子制作二进制文件。因此,它需要一个工具链。请纠正我,因为我在这里有疑问。
3 回答
工具链在嵌入式系统开发中起着非常重要的作用。在编译和构建时,您还需要特定于您的架构的交叉工具链。工具链将不是默认的。您必须在配置期间或在传递 make 命令时设置它,您已经指定了工具链前缀。
make CROSS_COMPILE=arm-none-linux-gnueabi-
在编译和构建 Busybox 时应该使用相同的工具链。如果您使用静态编译busybox。那么无需担心共享库。但是如果你用动态编译busy box,那么你的工具链在rootfs中扮演着重要的角色。在这里,您需要将工具链库复制到 rootfs/lib
文件夹。
只需键入以下命令即可知道需要复制哪些库。
strings _install/bin/busybox | grep ^lib
显示应该保存在/lib
rootfs 中的列表库。
该命令说,“从文件中获取所有字符串,并且只显示以 lib 开头的行。” 程序 ldd 不能使用,因为程序已经过交叉编译,不会在开发主机上运行。这些文件应该从工具链的 sysroot 目录中获取。大多数现代工具链都配置了 sysroot,它是一个目录,其中包含来自工具链的文件,这些文件可能出现在工具链所针对的系统的根文件系统上。要检查您的工具链是否支持 sysroot,请尝试以下操作:
$ arm-linux-gcc -print-sysroot
/arm-unknown-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 可以运行。
所以最后,如果你想编译任何应用程序或程序,你应该使用你编译过的这个工具链进行编译。
--sysroot=dir
此选项指定头文件和库所在的根目录。当你给
(gcc) -print-sysroot
这将显示相应的 gcc(如果它的独立工具链)以查看该特定目录的头文件和库。
在构建和编译 gcc 时构建独立的交叉工具链时,--sysroot=dir 用于查找相应的包含和库文件。
你可以在这里看到配置
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}
通常,此文件夹包含您所有的共享库。
@Shreyas,您的解释有误。Toolchain 只不过是一个交叉编译器,它可以交叉编译源代码,以便它可以在编译它的处理器架构上运行。甚至内核和引导加载程序都是 ac 代码,您希望将其移植到嵌入式板上,需要交叉编译,您需要工具链来交叉编译内核和 u-boot 源。所以需要工具链,它可能是u-boot bootloader、内核、rfs(Busybox)和应用程序。