Сборка кросс-компиляции binutils на OS X Yosemite

Я пытаюсь создать binutils для генерации кода MIPS в Mac OS X.

Я нашел этот сайт (http://www.theairportwiki.com/index.php/Building_a_cross_compile_of_GCC_for_MIPS_on_OS_X) из Как собрать GCC 4.8.x на хосте Mac OS X для цели MIPS и следовал инструкциям.

Я установил gcc-4.8 из brew и установил исходный код 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

Погуглив, я обнаружил, что мне нужно настроить переменную AR (архив) также из https://github.com/tpoechtrager/osxcross/issues/11. Я добавил 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).

Я только что создал тупой файл liblto_plugin.so в каталоге /usr/local/Cellar/gcc48/4.8.4/libexec/gcc/x86_64-apple-darwin14.3.0/4.8.4, чтобы подавить сообщение об ошибке, но в этом случае похоже, что /usr/ar вызывается, когда я использую /usr/bin/gcc-ar-4.8 для получения той же архитектуры и ошибки неопределенных символов.

Как решить эти вопросы? Как создать инструменты кросс-компилятора (gcc и binutils) в Mac OS X?


person prosseek    schedule 19.06.2015    source источник
comment
Подойдет ли какой-либо из этого? Намного проще заставить Macports создавать и поддерживать что-то для вас...   -  person Droppy    schedule 19.06.2015
comment
@Droppy: я стараюсь не использовать Macports, если это возможно, из-за некоторых проблем, с которыми я столкнулся, когда использовал его с brew. superuser.com/questions/181337/   -  person prosseek    schedule 19.06.2015
comment
Старайтесь не устанавливать CFLAGS через env, это часто является причиной проблем (то есть некоторые внутренние CFLAGS вещи тогда не будут установлены). Вы также можете избавиться от CPP и LD, в этом нет необходимости. Вам также следует подумать о замене PREFIX на ./configure --prefix.   -  person Thomas    schedule 20.06.2015
comment
@Thomas: мне нужен флаг компилятора, чтобы подавить сообщение об ошибке («sbrk» устарело), ​​я пробовал export CFLAGS+=-Wno-error=deprecated-declarations, чтобы получить ту же ошибку.   -  person prosseek    schedule 20.06.2015
comment
Не устанавливайте CFLAGS вообще, даже установка CFLAGS может вызвать проблемы (серьезно!). Вы уверены, что это ошибка, а не просто предупреждение?   -  person Thomas    schedule 20.06.2015
comment
@Thomas: я также пробовал без настройки CFLAGS, я получил ошибку («sbrk» устарел).   -  person prosseek    schedule 20.06.2015
comment
Вы пробовали --disable-werror?   -  person Thomas    schedule 20.06.2015
comment
Давайте продолжим обсуждение в чате.   -  person Thomas    schedule 20.06.2015


Ответы (1)


Генератор статической библиотеки для Mac OS X не ar, а libtool -static. Об этом есть еще один пост SO - Проблема со ссылкой на статическую библиотеку в Mac OS X: не найден(ы) символ(ы) для архитектуры x86_64.

binutils имеет несколько библиотек, которые связаны статически. Поэтому я заменил всю команду ar rc на libtool -static -o, чтобы получить статические библиотеки, которые не вызывают ошибок.

При этом мне также пришлось внести две модификации.

  1. Некоторые библиотеки генерируют скрипт libtool для конфликта с libtool Mac OS X, мне пришлось переименовать скрипт.
  2. Некоторые объектные файлы не содержат символов, мне пришлось удалить объекты.

Тогда я мог получить двоичные файлы без каких-либо проблем.

person prosseek    schedule 20.06.2015