crosstool-ng、目录结构和 sysroot
Posted
技术标签:
【中文标题】crosstool-ng、目录结构和 sysroot【英文标题】:crosstool-ng, directory structure, and sysroot 【发布时间】:2013-02-09 20:39:43 【问题描述】:感谢 crosstool-ng,我有一个可以工作的交叉编译器工具链 :) -- 然而,crosstool-ng 的文档很少,而且我对交叉编译还是个新手。在这种情况下,我认为特定的主机和目标并不重要。
我有一些关于目录结构的基本问题。工具链安装到以目标命名的目录中。里面是一组目录:
arm-unknown-linux-gnueabi
bin
include
lib
libexec
share
我认为这是针对实际的交叉编译器位,因为 bin/ 中的编译器确实为此目的工作。注意里面有一个arm-unknown-linux-gnueabi/目录,即里面的路径是../arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi
。里面还有一棵树:
bin
debug-root
include
lib
lib32
lib64
sysroot
lib* 目录是指向 sysroot/ 的符号链接。 bin里面的东西好像和父目录/bin里面的东西是同一套交叉编译工具:
> bin/gcc -v
Using built-in specs.
COLLECT_GCC=./gcc
Target: arm-unknown-linux-gnueabi
Configured with: /usr/x-tool/.build/src/gcc-4.7.2/configure
--build=x86_64-build_unknown-linux-gnu
--host=x86_64-build_unknown-linux-gnu
--target=arm-unknown-linux-gnueabi
所以我的第一个问题是:这些是干什么用的?这个目录是干什么用的?
我的第二个问题然后是:应该如何使用 sysroot/?它显然是针对目标平台原生的支持库,所以我想如果我正在构建这样一个库,我应该将它用作 --prefix
,尽管它与使用父级相同目录,因为 lib* 是符号链接的……这个带有 bin 和符号链接到 sysroot 的“中间目录”令人困惑。我相信(某些)autotools 样式的包可以配置为“--with-sysroot”。 这有什么意义,如果我看到它,应该如何将它与其他选项(例如 --prefix 等)一起使用?
【问题讨论】:
我也对这个感到困惑!我正在尝试使用 crosstool-ng 为我自己的 linux 发行版制作工具链。据我所知,我希望我的 sysroot 只是“/”,因为我想构建一个工具链,该工具链将在目标系统中用作唯一的工具链,而不是用于交叉编译之类的东西。目前,生成的工具链甚至不查看标准位置,例如 /lib 或 /usr/lib。文档似乎甚至没有涵盖我的(完全正常的?)用例。 @DanieleTesta 如果您不构建交叉编译器,为什么要使用 crosstool-ng?如果你不知道,你应该看看linuxfromscratch.org 那应该解释如何以传统方式从源代码编译原生编译器、工具链和 C 库——它实际上是分阶段完成的,使用一个编译器来构建接下来,系统的不同基本部分也被构建;见章节。 5 尤其如此。我承认已经好几年没有读过这篇文章了,但很高兴看到它仍在维护和开发中,我从中学到了很多。 因为我正在使用 crosstool-ng 为另一个拱门构建工具链?跨原生构建。在 x86 上使用 crosstool-ng 为 ARM 构建可以构建 ARM 二进制文件的工具链。然后将生成的工具链移动到我准备好的 rootfs 以在 ARM 系统上运行。 抱歉,我误解了您最初的评论。不过,我不确定你的对于 crosstool-ng 是否真的是“完全正常”的,因为正常的方法(我认为)是使用现有的交叉编译器(x86 -> ARM)来构建原生 ARM编译器。我认为大多数发行版都有一个用于 arm v7 和 v8 的打包交叉编译器。 嗯,根据文档看起来很正常。他们甚至包括跨原生选项。在此处查看“选项 3,跨原生”:crosstool-ng.github.io/docs/toolchain-types 【参考方案1】:第一个问题,作为工具链安装目录:
bin/arm-unknown-linux-gnueabi-gcc arm-unknown-linux-gnueabi/bin/gcc它们是相同的,确实是硬链接。
您可以通过 CC=arm-unknown-linux-gnueabi-gcc 使用 arm-unknown-linux-gnueabi-gcc,例如
export PATH=<toolchain installed dir>/bin:$PATH
CC=arm-unknown-linux-gnueabi-gcc ./configure
make
或者
export PATH=<toolchain installed dir>/arm-unknown-linux-gnueabi/bin:$PATH
./configure
make
我一直使用第一种形式,我不确定后一种形式是否有效。
关于你的第二个问题,根据我的经验,你不需要关心 sysroot。交叉编译器会自动在 sysroot/usr/include 中找到正确的 C 头文件。
除了要交叉编译一些库并安装到sysroot,可以通过
export PATH=<toolchain installed dir>/bin:$PATH
CC=arm-unknown-linux-gnueabi-gcc ./configure --prefix=<toolchain installed dir>/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot
make
make install
【讨论】:
我仍然没有注意到这两个垃圾箱包含硬链接! 不管是不是硬链接,md5校验和都是一样的【参考方案2】:从 Thomas Petazzoni 的演讲 Anatomy of Cross-Compilation Toolchains 的 38:39 开始,演讲者深入介绍了输出目录结构。
【讨论】:
以上是关于crosstool-ng、目录结构和 sysroot的主要内容,如果未能解决你的问题,请参考以下文章
在ubuntu下编译crosstool-ng的时候ct-ng build返回错误You must NOT be root to run crosstool-NG