如何根据主机系统上存在的内容为 binutils、gcc 和其他链接到不同库的包创建二进制包(rpm、deb 等)?
在 LFS 项目中,为了将新系统与主机隔离,交叉编译是通过为新系统使用不同的目标三元组来伪造的(此处)。这可以防止包链接到仅存在于主机系统上的库。但是,如果使用类似的方法来构建二进制包,那么这些包肯定会有与构建它们的系统不同的目标三元组。
我阅读了这封电子邮件,其中讨论了构建主机隔离的 gcc。但得出的结论是,像 LFS 那样伪造交叉编译是构建与主机系统隔离的 gcc 的唯一合理方法。
我尝试构建带有 --prefix 和 --with-sysroot 设置为空目录的 binutils,但生成的二进制文件链接到我的主机系统上的 libfl。
编辑:
我认为我最初的解释并不清楚。请允许我举一个更具体的例子:
GNU 的 binutils不依赖于 GNU flex,我可以通过在我的 arch 系统上运行来验证这一点,ldd /usr/bin/ar
我发现它没有链接到libfl.so
. 尽管如此,我仍然在我的主机系统上安装了 flex。现在,我想编译一个 binutils 二进制文件,并将其复制到另一个具有相同架构的系统中。这个新系统没有安装 GNU flex,但这应该无关紧要,因为 binutils 不依赖于 GNU flex。问题是当我在我的主机系统上编译 binutils 时,它链接到libfl.so.2
!我认为这是因为当我构建 binuitls 时,它“注意到”我安装了 flex,所以决定链接到它。我想知道如何编译软件(如 binutils)而不链接到我的主机系统上存在的可选依赖项(如 flex)。二进制包维护者在尝试编译他们的软件时肯定会遇到同样的问题吗?
Binutils 只是这种情况下的一个例子,我真的在寻找一种更通用的方法,包维护者可以使用它来阻止他们的软件链接到主机系统中的可选依赖项。