在OS X Yosemite上构建binutils的交叉编译

时间:2015-06-19 20:54:34

标签: macos gcc cross-compiling binutils

我正在尝试构建binutils以在Mac OS X上生成MIPS代码。

我在http://www.theairportwiki.com/index.php/Building_a_cross_compile_of_GCC_for_MIPS_on_OS_X找到了此网站(How to build GCC 4.8.x on Mac OS X host for MIPS target),并按照说明操作。

我从brew安装了gcc-4.8,并安装了binutils和gcc的源代码。这是编译选项设置。

$ export CC=/usr/local/bin/gcc-4.8
$ export CXX=/usr/local/bin/g++-4.8
$ export CPP=/usr/local/bin/cpp-4.8
$ export LD=/usr/local/bin/gcc-4.8
$ export PREFIX=/opt/cross/gcc-mips
$ export CFLAGS=-Wno-error=deprecated-declarations

然后我配置,并制作bintuils。

问题是在构建静态库之后,我有一条错误消息,说明存档不是为x86_64构建的,然后我有一堆未定义的符号错误。

ignoring file ./../intl/libintl.a, file was built for archive which is not the architecture being linked (x86_64): ./../intl/libintl.a

Undefined symbols for architecture x86_64:
  "__bfd_abort", referenced from:
      _fix_new_internal in write.o
      _size_seg in write.o

谷歌搜索我还需要从https://github.com/tpoechtrager/osxcross/issues/11设置AR(存档)变量。我添加了export AR=/usr/local/bin/gcc-ar-4.8,但是我有另一条错误消息,因为gcc-ar-4.8不起作用。

/usr/local/bin/gcc-ar-4.8 
/usr/local/bin/gcc-ar-4.8: Cannot find plugin 'liblto_plugin.so'

再次搜索gcc-ar不适用于Mac OS X(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56893)。

gcc-ar is for use with newer GNU binutils only as that is the only ar which supports plugins.  
Apple's ar does not support plugins (though it could be made to; it will be a different plugin interface than the GNU BFD 
plugin interface which GCC supports right now).

我刚刚在/usr/local/Cellar/gcc48/4.8.4/libexec/gcc/x86_64-apple-darwin14.3.0/4.8.4目录中创建了一个愚蠢的'liblto_plugin.so'文件来禁止显示错误消息,但在这种情况下,当我使用/usr/ar时会调用/usr/bin/gcc-ar-4.8获得相同的架构和未定义的符号错误。

如何解决这些问题?如何在Mac OS X上构建交叉编译工具(gcc和binutils)?

1 个答案:

答案 0 :(得分:2)

Mac OS X的静态库生成器不是ar,而是libtool -static。还有另一篇关于此事的SO帖子 - Static library link issue with Mac OS X: symbol(s) not found for architecture x86_64

binutils有多个静态链接的库。所以我用ar rc替换了所有libtool -static -o命令,以获得不会导致错误的静态库。

在这样做时,我还必须进行两次修改。

  1. 某些库生成libtool脚本与Mac OS X的libtool冲突,我不得不重命名脚本。
  2. 有些目标文件不包含符号,我不得不删除对象。
  3. 然后我可以毫无问题地获得二进制文件。