Получение GMP для работы с GCC 4.5.2

Я пытаюсь сделать кросс-компилятор с файлами из http://crossgcc.rts-software.org/doku.php?id=i386linuxgccformac

Я на Intel Mac (10.6.6, x86_64) Я скомпилировал: gmp, mpfr, mpc для кросс-компилятора как 32-битный (так как я на 64-битном Mac), но я получаю

ld: warning: option -s is obsolete and being ignored
ld: warning: ignoring file /gmp1/lib/libmpc.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: ignoring file /gmp1/lib/libmpfr.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
ld: warning: ignoring file /gmp1/lib/libgmp.dylib, file was built for unsupported file format which is not the architecture being linked (i386)

При компиляции GCC с помощью:

--prefix=/usr/local/i386-linux-4.5.2 --target=i386-linux --enable-languages=c --without-headers --disable-shared --disable-threads --disable-nls --with-gmp=/gmp1 --with-gmp-lib=/gmp1 --with-gmp-include=/gmp1 --with-mpfr=/gmp1 --with-mpfr-include=/gmp1 --with-mpfr-lib=/gmp1 --with-mpc=/gmp1 --with-mpc-lib=/gmp1 --with-mpc-include=/gmp1

Кроме того, если я скомпилирую GMP с помощью:

./configure --prefix=/gmp1 --host=i386-linux

Я получил:

configure: WARNING: +----------------------------------------------------------
configure: WARNING: | Cannot determine global symbol prefix.
configure: WARNING: | link -dump -symbols output doesn't contain a global data symbol.
configure: WARNING: | Will proceed with no underscore.
configure: WARNING: | If this is wrong then you'll get link errors referring
configure: WARNING: | to ___gmpn_add_n (note three underscores).
configure: WARNING: | In this case do a fresh build with an override,
configure: WARNING: |     ./configure gmp_cv_asm_underscore=yes
configure: WARNING: +----------------------------------------------------------
checking how to switch to read-only data section... .data
checking for assembler .type directive... 
checking for assembler .size directive... 
checking for assembler local label prefix... configure: WARNING: "link -dump -symbols" failure
configure: WARNING: cannot determine local label, using default L
L
checking for assembler byte directive... .byte
checking how to define a 32-bit word... link: illegal option -- d

person Daniel    schedule 01.03.2011    source источник


Ответы (2)


Я думаю, что вы запутались в том, какой пакет должен быть скомпилирован для какой платформы:

  • GCC необходимо скомпилировать для хоста x86_64 MacOS X и цели i386-linux.

  • GMP, MPC и MPFR являются зависимостями времени выполнения для GCC. Поэтому их также необходимо скомпилировать для хоста GCC - x86_64 в вашем случае. Поэтому параметр --host=i386-linux в команде настройки GMP неверен.

Как правило, для цели кросс-компилятора (например, i386-linux) необходимо создавать только те библиотеки, которые будут компоноваться в программах, скомпилированных с помощью GCC. GMP и MPFR не являются такими библиотеками, если ваши программы на самом деле не используют их — в этом случае вам потребуется две копии таких библиотек, одна для GCC и кросс-сборка для цели.

РЕДАКТИРОВАТЬ:

Рассматривали ли вы возможность использования MacPorts? Он имеет все зависимости для вашего кросс-компилятора:

Также существует более старый кросс-компилятор на основе newlib для i386:

Даже если вы не хотите их использовать, вы все равно можете ознакомиться с инструкциями по сборке в их портфайлах.

Суть в следующем:

  • Примените любые исправления, которые нужны этим библиотекам — MacPorts уже делают это.

  • Скомпилируйте библиотеки для хоста сборки, например MacOSX/x86_64. Это означает, что в любых --host опциях для их вызовов configure вы должны быть чем-то вроде --host=x86_64-darwin (или что-то еще, что нужно вашему хосту). Если configure может определить хост самостоятельно, вы можете вообще пропустить --host опции.

  • Скомпилируйте GCC с --host в качестве узла сборки (64-разрядная Mac OS X) и целью i386-linux, например. --target=i386-linux. На вашем месте я бы начал с компилятора только для языков C и C++.

См. также это руководство. В нем есть некоторая информация о том, как создать работающую цепочку инструментов с надлежащим glibc.

Тем не менее, я думаю, что вам лучше установить правильный дистрибутив Linux на виртуальную машину по целому ряду причин. Есть ли причина, по которой вам нужен именно кросс-компилятор? Что вы хотите сделать с этим компилятором?

person thkala    schedule 09.03.2011
comment
Я немного запутался, не могли бы вы привести пример - person Daniel; 09.03.2011
comment
@thkala также gmp не позволяет установить --target? - person Daniel; 09.03.2011
comment
@thkala я пробовал ./configure --prefix=/gmp1 --host=i386-apple-darwin10.6.0 --build=i386-linux --with-gmp=/gmp1 --with-mpfr=/gmp1, но это приходит вверх с вышеуказанной ошибкой (как указано в вопросе) - person Daniel; 09.03.2011
comment
@Daniel: gmp, mpfr и mpc должны быть скомпилированы для вашего хоста сборки — просто скомпилируйте их, как и любую другую библиотеку для Darwin. --target не имеет для них никакого значения. Только GCC имеет целевую опцию. - person thkala; 09.03.2011
comment
я все еще в замешательстве, я пробовал ./configure --prefix=/gmp1 раньше, и он получил /gmp1/lib/lib.gmp.dylib, файл был создан для неподдерживаемого формата файла, который не связан с архитектурой (i386 ) - person Daniel; 09.03.2011
comment
Возможно, я не объяснил это должным образом, я собираю gmp, mpfr и mpc для моего текущего gcc, поэтому я могу скомпилировать кросс-компилятор, используя его. - person Daniel; 09.03.2011
comment
@Daniel: ты можешь что-нибудь попробовать? Скомпилируйте mpfr, gmp, mpc и gcc вообще без опций --host, только --target для GCC. Пусть configure попробует разобраться... - person thkala; 09.03.2011
comment
Я компилирую gmp отдельно от gcc? - person Daniel; 10.03.2011
comment
@Daniel: GCC использует общесистемные GMP, MPC и MPFR, как и любая другая программа, работающая на хосте сборки. Таким образом, компиляция этих пакетов не зависит от GCC. - person thkala; 10.03.2011
comment
@thkala Хорошо, он скомпилирован и установлен, но почему я получаю указанную выше ошибку? - person Daniel; 11.03.2011
comment
@Daniel: Не могли бы вы подробнее рассказать о том, как вы скомпилировали что и какую ошибку вы получаете? Просто чтобы убедиться, что мы на одной волне, прежде чем я начну предлагать предложения... - person thkala; 11.03.2011
comment
@thkala Я пытаюсь скомпилировать gmp, mpfr, mpc для моего текущего компилятора gcc (который поставляется с xcode), который является x86_64 на Intel Mac 10.6.6, поэтому я могу использовать его для компиляции другого компилятора gcc для i386-linux. какую команду ./configure следует использовать для gmp, mpfr и mpc? - person Daniel; 11.03.2011
comment
@Daniel: вы должны скомпилировать эти библиотеки с правильными параметрами для их использования на вашем хосте сборки (то есть на вашем Mac). Вы можете добавить --prefix, чтобы они не путались с общесистемными версиями, но я думаю, что configure должен разобраться с остальным. Я бы начал с ./configure --prefix=/test или что-то в этом роде. Обязательно добавьте правильные параметры --with-xxx=... для любой библиотеки, которую вы устанавливаете в нестандартный каталог. - person thkala; 11.03.2011
comment
@thkala, у меня до сих пор это не работает. и щедрость 50 заканчивается очень скоро. пожалуйста помоги - person Daniel; 12.03.2011
comment
@thkala относительно обновления вашего ответа, мне нужно использовать кросс-компилятор просто потому, что слишком сложно переключаться между виртуальной машиной и mac os x, я не уверен на 100%, в чем проблема, почему он говорит без символов - person Daniel; 13.03.2011
comment
@thkala Проблема в том, что установка gmp, mpfr и mpc на моем Mac создана для x86_64 darwin (что хорошо для собственной компиляции), но я не знаю, что делать, чтобы установить gmp, чтобы gcc мог скомпилировать связанный кросс-компилятор с библиотеками gmp,mpfr,mpc. Я установил --with-gmp, но это не имеет большого значения - person Daniel; 13.03.2011
comment
@thkala хорошо, извините за ответы, я попытался скомпилировать gmp с помощью ./configure --prefix=/gmp1 --host=i386-linux --build=x86_64-darwin10.6.0, но в конце процесса компиляции он приходит с тоннами of не имеет символов: /usr/bin/ranlib: файл: .libs/libgmp.a(mp_clz_tab.o) не имеет символов /usr/bin/ranlib: файл: .libs/libgmp.a(obprintf.o) не имеет символы /usr/bin/ranlib: файл: .libs/libgmp.a(obvprintf.o) не имеет символов /usr/bin/ranlib: файл: .libs/libgmp.a(obprntffuns.o) не имеет символов - person Daniel; 13.03.2011
comment
@thkala make check выдает символы Undefined для архитектуры i386 точно так же, как это делал gcc?? - person Daniel; 13.03.2011
comment
@Daniel: GCC использует gmp и т. д. для оценки статических арифметических выражений. Таким образом, нативная версия также подходит для кросс-компилятора. IIRC только для серверной части Fortran требуется версия этих библиотек, подходящая для цели, если только это не изменилось в последних версиях. Вы пытались создать кросс-компилятор только для C? - person thkala; 13.03.2011
comment
кросс-компилятор построен только на C - person Daniel; 13.03.2011
comment
@Daniel: эээ... --host=i386-linux звучит неправильно. Сам кросс-компилятор должен использовать библиотеки, встроенные в узел сборки (Mac). Только любые заглушки/общие библиотеки, связанные в скомпилированных программах, должны использовать собственные библиотеки для цели (i386). - person thkala; 13.03.2011
comment
Хорошо, а если я перекомпилирую gmp без опций --host, --build, будет ли это иметь какое-то значение, если кросс-компилятор будет сделан как 32-битный, а gmp скомпилирован как 64-битный? - person Daniel; 13.03.2011
comment
@Daniel: исполняемые файлы кросс-компилятора должны быть 64-битными. Исполняемые файлы должны быть 32-битными. - person thkala; 13.03.2011
comment
@thkala как насчет того, чтобы отправить вам config.log? - person Daniel; 13.03.2011
comment
@Daniel: я только что создал кросс-компилятор C/C++ без кода (то есть без glibc) для arm-linux-elf. Единственные GMP, MPC и MPFR, которые ему нужны, это те, которые поставляются с моим дистрибутивом Linux, но он без проблем создает объектные файлы для ARM. Вы дошли до этого этапа? - person thkala; 13.03.2011
comment
я думаю, что есть проблема с библиотеками C для mac os x, gmp даже не компилируется должным образом (говорит без символов) без или с --build --host - person Daniel; 13.03.2011
comment
@Daniel: вы пытались получить GMP и т. д. от MacPorts? IIRC было включено несколько патчей... - person thkala; 13.03.2011
comment
sudo port install gmp-5.0.1 Пароль: Ошибка: порт gmp-5.0.1 не найден - person Daniel; 13.03.2011
comment
Как вы собрали свой голый (без glibc) кросс-компилятор? - person Daniel; 13.03.2011
comment
@Daniel: э-э... я думаю, должно быть sudo port install gmp - person thkala; 13.03.2011
comment
sudo port install gmp выдает: ---› Очистка gmp и выход - person Daniel; 13.03.2011
comment
В настоящее время установлены следующие порты: gmp @5.0.1_0 (активный) platform='darwin 10' archs='x86_64' - person Daniel; 13.03.2011
comment
@Daniel: теперь установите mpfr и libmpc - тогда вы можете попробовать создать свой кросс-компилятор. - person thkala; 13.03.2011
comment
установил, но такая же проблема? также извините за то, что 50 повторений не были присуждены вам, мне пришлось уйти до истечения срока их действия. - person Daniel; 13.03.2011
comment
@Daniel: Хм... та же проблема? Странно... вы случайно не указали опцию --with-gmp=? Если вы это сделали, попробуйте удалить его - теперь конфигурация GCC может найти gmp самостоятельно ... - person thkala; 13.03.2011
comment
@thkala мы можем как-то поговорить в чате или что-то в этом роде, это довольно сложно объяснить вот так - person Daniel; 13.03.2011
comment
Я только что попытался скомпилировать gcc с помощью: ../gcc-4.5.2/configure --enable-languages=c --without-headers --disable-shared --disable-threads --disable-nls --target=i386- linux --prefix=/usr/local/i386-linux-4.5.2 и получаю: ../../../gcc-4.5.2/libgcc/config/libbid/bid_decimal_globals.c:47:18: фатальная ошибка: fenv.h: Компиляция такого файла или каталога не завершена. make[2]: *** [bid_decimal_globals.o] Ошибка 1 make[2]: *** Ожидание незавершенных заданий.... make[1]: *** [all-target-libgcc] Ошибка 2 make: *** [все] Ошибка 2 - person Daniel; 13.03.2011
comment
@Daniel: мне не удалось скомпилировать libgcc для ARM с помощью «голого» компилятора — возможно, для этого вам понадобится libc. Я только что собрал кросс-компилятор с помощью make all-gcc, а затем make install-gcc. - person thkala; 13.03.2011
comment
мы можем как-то поговорить в чате или что-то в этом роде, это довольно сложно объяснить вот так - person Daniel; 13.03.2011
comment
@Daniel: Я бы предпочел оставить полное обсуждение здесь, чтобы любой, у кого возникла эта проблема, не упустил никакой информации. Вы можете отредактировать свой вопрос с любой дополнительной информацией - это имеет дополнительное преимущество, заключающееся в обновлении его статуса в SO, что также может заставить кого-то еще ответить. - person thkala; 13.03.2011
comment
@Daniel: Вы пытались скомпилировать gcc с configure --disable-nls --enable-languages=c,c++ --without-headers --target=i386-linux-elf --prefix=/usr/local/i386-linux-4.5.2, а затем с make all-gcc? - person thkala; 14.03.2011
comment
я попробовал это только что, я думаю, что это сработало :), но я должен перепроверить - person Daniel; 14.03.2011
comment
@Daniel: если make all-gcc удалось, вы можете установить с помощью make install-gcc. Чтобы протестировать компилятор, вам, возможно, придется изменить переменную PATH, чтобы as и другие binutils для i386-linux располагались перед общесистемным as при запуске кросс-компилятора. - person thkala; 14.03.2011
comment
@Daniel: Также имейте в виду, что вы не можете связать программу для Linux с этим компилятором. Вы можете создавать только объектные файлы (флаг -c) и можете связывать только исполняемые файлы, которые не требуют объектов среды выполнения. Для этого вам понадобится libc и второй кросс-компилятор. По сути, вы можете кросс-компилировать ядро ​​​​Linux, но вы не можете (пока) кросс-компилировать Hello world... - person thkala; 14.03.2011
comment
Хорошо, думаю, я просто забуду о создании кросс-компилятора на моем Mac для Linux, это слишком хлопотно, не могли бы вы помочь мне сделать кросс-компилятор для arm-linux на виртуальной машине Linux? - person Daniel; 14.03.2011

Использовали ли вы опцию «ABI=32» при компиляции GMP? Если нет, я думаю, что он будет использовать 64-битный код, даже если хост/цель указаны как i386.

person casevh    schedule 08.03.2011