0

我是否正确,在为嵌入式设备制作小型 Linux 系统时,我们需要基于使用默认工具链的配置集构建内核。而 rootfs 需要工具链?由于架构是在内核中设置的,因此不需要工具链。而忙碌的盒子制作二进制文件。因此,它需要一个工具链。请纠正我,因为我在这里有疑问。

4

3 回答 3

2

工具链在嵌入式系统开发中起着非常重要的作用。在编译和构建时,您还需要特定于您的架构的交叉工具链。工具链将不是默认的。您必须在配置期间或在传递 make 命令时设置它,您已经指定了工具链前缀。

make CROSS_COMPILE=arm-none-linux-gnueabi-

在编译和构建 Busybox 时应该使用相同的工具链。如果您使用静态编译busybox。那么无需担心共享库。但是如果你用动态编译busy box,那么你的工具链在rootfs中扮演着重要的角色。在这里,您需要将工具链库复制到 rootfs/lib文件夹。

只需键入以下命令即可知道需要复制哪些库。

strings _install/bin/busybox | grep ^lib 显示应该保存在/librootfs 中的列表库。

该命令说,“从文件中获取所有字符串,并且只显示以 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 可以运行。

所以最后,如果你想编译任何应用程序或程序,你应该使用你编译过的这个工具链进行编译。

于 2013-07-22T12:30:28.787 回答
1

--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}

通常,此文件夹包含您所有的共享库。

于 2013-08-05T07:30:52.850 回答
0

@Shreyas,您的解释有误。Toolchain 只不过是一个交叉编译器,它可以交叉编译源代码,以便它可以在编译它的处理器架构上运行。甚至内核和引导加载程序都是 ac 代码,您希望将其移植到嵌入式板上,需要交叉编译,您需要工具链来交叉编译内核和 u-boot 源。所以需要工具链,它可能是u-boot bootloader、内核、rfs(Busybox)和应用程序。

于 2013-07-26T03:11:32.213 回答