在为嵌入式设备制作小型linux系统时,我们需要基于默认工具链的配置集进行内核构建,这是正确的吗?而rootfs需要一个工具链?由于架构是在内核中设置的,因此不需要工具链。而忙碌的盒子则是二进制的。因此,它需要一个工具链。我在这里有疑问,请纠正我。
发布于 2013-07-22 20:30:29
工具链在嵌入式系统开发中起着非常重要的作用。在编译和构建过程中,您还需要跨工具链,这是特定于您的Architecture.Tools链的,而不是必须在配置期间设置它,或者在传递default.You命令时,您必须指定您的工具链前缀。
make CROSS_COMPILE=arm-none-linux-gnueabi-
编译和构建Busybox时应该使用相同的工具链。如果你用statically.Then编译busybox,就不需要担心共享库了。但是如果你用动态编译繁忙的机器,那么你的工具链在rootfs中扮演着重要的角色。这里您需要将工具链的库复制到rootfs /lib文件夹中。
只需在命令后键入即可知道需要复制的库是什么。
strings _install/bin/busybox | grep ^lib显示了应该保存在根文件系统的/lib中的列表库。
这个命令说,“从文件中获取所有字符串,并且只显示以lib开头的行。”无法使用程序ldd,因为该程序已交叉编译,无法在开发主机上运行。这些文件应该从工具链的sysroot目录中获取。大多数现代工具链都配置了sysroot,这是一个包含来自工具链的文件的目录,这些文件很可能出现在工具链所针对的系统的根文件系统上。要检查您的工具链是否支持sysroot,请尝试以下操作:
$ arm-linux-gcc -print-sysroot
/arm-未知-linux-gnueabi/bin/arm-linux-gcc如果这是有效路径,则应从中复制文件。如果未显示路径,请使用find在中查找sysroot目录,或使用find查找libc.so:
找到libc和libm后,创建(your rootfs)/lib目录并将它们复制到该目录。这些文件很可能是指向其他文件的符号链接,因此一定要将它们全部收集起来。下一个要获取的文件是动态加载器,通常称为ld-linux-,它与libc.so.*一起驻留在lib目录中。将其复制到/lib目录。您的系统现在拥有所有的共享库和加载器,所以BusyBox可以运行了。
所以最后,如果你想编译任何应用程序或程序,你应该使用你编译的busybox工具链来编译。
发布于 2013-08-05 15:30:53
--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-07-26 11:11:32
@Shreyas,你有一个错误的解释。工具链只是一个交叉编译器,它交叉编译源代码,以便它可以在编译时所针对的处理器体系结构上运行。即使内核和bootloader是一个c代码,你想要它移植到嵌入式板卡上,需要交叉编译,你需要工具链来交叉编译内核和u-boot源代码。所以工具链是必需的,它可以是u-boot引导加载程序、内核、rfs (Busybox)和应用程序。
https://stackoverflow.com/questions/17785208
复制相似问题