1

我已经成功构建了几个跨 gcc 编译器,它们托管在 OSX Lion 上,并针对 i386-pc-solaris2.10 和 x86_64-linux-gnu。对于那些安装在我的路径中的 $BINUTILSROOT 和 $BINUTILSROOT/bin 下的目标,我有 2.22 binutils。阅读http://gcc.gnu.org/install/configure.html,特别是

--with-as=pathname 指定编译器应该使用pathname指向的汇编器,而不是通过标准规则找到的那个来寻找汇编器,它们是:

  • 除非使用交叉编译器构建 GCC,否则请检查 libexec/gcc/target/version 目录。libexec 默认为 exec-prefix/libexec;exec-prefix 默认为前缀,默认为 /usr/local,除非被上述 --prefix=pathname 开关覆盖。target 是目标系统三元组,例如 `sparc-sun-solaris2.7',version 表示 GCC 版本,例如 3.0。
  • 如果目标系统与您构建的目标系统相同,请检查操作系统特定的目录(例如 Sun Solaris 2 上的 /usr/ccs/bin)。
  • 在 PATH 中检查名称以目标系统三元组为前缀的工具。
  • 如果主机和目标系统三元组相同(换句话说,如果主机工具也可用于目标,我们将使用主机工具)。

我以为我的 -gcc (配置了--with-gnu-as --with-gnu-ld)会分别拾取 i386-pc-solaris2.10-as 和 x86_64-linux-gnu-as (以及相应的 -ld ) 因为它们位于 PATH 中的 $BINUTILSROOT/bin 中,因此上面列表中的第三个项目符号应该适用。但这似乎不起作用,我已经用 dtrace 确认 -gcc 不会在 PATH 中搜索 -as 和 -ld。我发现唯一可行的解​​决方案是同时完全指定 as 和 ld 添加

--with-as=$BINUTILSROOT/bin/-as --with-ld=$BINUTILSROOT/bin/-ld

配置 gcc 时。

我是否误解了 gcc 文档,或者这是使交叉编译工作的唯一方法?

4

1 回答 1

1

通常你会在与你的 cross-binutils 相同的目录中安装一个交叉编译器。如果你这样做,它会正常工作。

如果您没有将编译器安装到同一目录中,因为您想“暂存”它以构建包,那么您应该配置--prefix最终安装位置(binutils 应该已经存在),然后安装和

make DESTDIR=/path/to/staging/dir install

覆盖前缀设置。然后,您可以在使用这些文件之前将它们复制到真正的前缀中(可能是软件包安装的一部分)。

如果您出于其他原因不想安装在同一目录中,那么您必须指定您发现的路径。还有其他方法可以使其工作,但 --with-as 是预期的解决方案。如果您真的不喜欢该解决方案,那么您可以这样做

make configure-gcc
ln -s $BINUTILSROOT/bin/as gcc/as
ln -s $BINUTILSROOT/bin/ld gcc/ld

这将使构建工作(IIRC),但最终安装的编译器仍将在标准位置查找。事实上,这是可行的,因为仅在构建期间,gcc 目录标准位置之一。

这一切的原因是它不使用“x86_64-linux-gnu-as”:它实际上使用“prefix/x86_64-linux-gnu/bin/as”,如果不存在,它会在另一个中查找“as”的标准位置,并且通常会找到运行不佳的主机“/usr/bin/as”(并导致非常混乱的错误消息)。

于 2012-04-16T12:47:32.243 回答