Отказ сборки кросс-компиляции 64-битного GCC - PullRequest
4 голосов
/ 28 мая 2011

Я пытаюсь создать работающий кросс-компилятор gcc, который живет на моей локальной машине [Darwin new-host-2.home 10.7.4 Darwin Kernel Версия 10.7.4: Пн, 18 апреля, 21:24:17 PDT 2011; root: xnu-1504.14.12 ~ 3 / RELEASE_X86_64 x86_64] и предназначается для цели FreeBSD 8.2 x86_64 (AMD64 в терминах FreeBSD).

Я собираю gcc 4.3.1, binutils 2.19, GMP 4.2.3, MPFR 2.3.2.

Я вижу пару вещей, которые могут пойти не так, но они могут быть красными сельдями. Для чего это стоит, я беру известные рабочие скрипты для создания кросс-компилятора и просто пытаюсь заставить их работать для архитектуры x86_64, так что я знаю, что я не в левом поле ..

Я использую цель компилятора gcc "x86_64-pc-freebsd7", которая кажется правильной. Я использую флаги компилятора: compilerConfigureFlags="--enable-version-specific-runtime-libs --enable-shared --enable-threads=posix --disable-checking --disable-libunwind-exceptions --with-system-zlib --enable-__cxa_atexit" и настраиваю binutils, используя "--enable-64-bit-bfd"

В моей последней ошибке; что-то, что привлекает мое внимание, это «-m32», и я не уверен, должно ли оно быть там. Ошибка в том, что ld не может иметь смысла из моего «несовместимого» файла / Developer / Cocotron / 1.0 / FreeBSD / x86_64 / gcc-4.3.1 / x86_64-pc-freebsd7 / lib / libc.a при поиске для -lc . Когда я запускаю file на libc.a и libc.so из коробки FreeBSD, я получаю:

sh-3.2 # file /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.a/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3 .1 / x86_64-pc-freebsd7 / lib / libc.a: текущий архив ar
sh-3.2 # file /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.so /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.so: общий объект ELB 64-битный LSB, x86-64, версия 1 (FreeBSD), динамически связанный, раздели

Последняя строка, на которой умирает моя сборка:

/Developer/Cocotron/1.0/build/FreeBSD/x86_64/gcc-4.3.1/./gcc/xgcc -B / Developer / Cocotron / 1.0 / build / FreeBSD / x86_64 / gcc-4.3.1 /./ gcc / - B / Developer / Cocotron / 1.0 / FreeBSD / x86_64 / gcc-4.3.1 / x86_64-pc-freebsd7 / bin / -B / Developer / Cocotron / 1.0 / FreeBSD / x86_64 / gcc-4.3.1 / x86_64-pc-freebsd7 / lib / -isystem /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/include -isystem /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64- pc-freebsd7 / sys-include -O2 -O2 -g -m32 -DIN_GCC -DCROSS_DIRECTORY_STRUCTURE -DNATIVE_CROSS -W -Wall -Wwrite-strings -Wstrict-прототипы -Wmissing-прототипы -Wold-style-definition -isystem ./include -fPIC -pthread -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED -shared -nodefaultlibs -Wl, - soname = libgcc_s.so.1 -Wl, - version-script = libgcc.map -o ./libgcc_s. - O2 -g -m32 -B./ _muldi3_s.o _negdi2_s.o _lshrdi3_s.o _ashldi3_s.o _ashrdi3_s.o _cmpdi2_s.o _ucmpdi2_s.o _clear_cache_s.o _enable_execute_stack_s.o _trampoline_s.o _trampoline_s.o _trampoline_s.o _ si2_s.o _absvdi2_s.o _addvsi3_s.o _addvdi3_s.o _subvsi3_s.o _subvdi3_s.o _mulvsi3_s.o _mulvdi3_s.o _negvsi2_s.o _negvdi2_s.o _s2 o _ctzdi2_s.o _popcount_tab_s.o _popcountsi2_s.o _popcountdi2_s.o _paritysi2_s.o _paritydi2_s.o _powisf2_s.o _powidf2_s.o _powixf2_s.o _powitf2_s.o _o_o. .o _divtc3_s.o _bswapsi2_s.o _bswapdi2_s.o _fixunssfsi_s.o _fixunsdfsi_s.o _fixunsxfsi_s.o _fixsfdi_s.o _fixdfdi_s.o _fixxfdi_s.o _fixtfdi_s.o _fixunssfdi_s.o _fixunsdfdi_s.o _fixunsxfdi_s.o _fixunstfdi_s.o _floatdisf_s.o _floatdidf_s.o _floatdixf_s.o _floatditf_s.o _floatundisf_s.o _floatundidf_s.o _floatundixf_s.o _floatunditf_s.o _divdi3_s.o _moddi3_s.o _udivdi3_s.o _umoddi3_s.o _dw.w.dw.d sjlj_s.o gthr-gnat_s.o unwind-c_s.o emutls_s.o -lc && rm -f ./libgcc_s.so && if [-f ./libgcc_s.so.1]; затем mv -f ./libgcc_s.so.1 ./libgcc_s.so.1.backup; еще правда; fi && mv ./libgcc_s.so.1.tmp ./libgcc_s.so.1 && ln -s libgcc_s.so.1 ./libgcc_s.so/Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld: пропуск несовместимых /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7 / lib // libc.so при поиске -lc /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld: пропуск несовместимого /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/lib/libc.a при поиске -lc /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld: не удается найти -lc collect2: ld вернул 1 состояние выхода make [2]: *** [libgcc_s.so] Ошибка 1 make [1]: *** [all-target-libgcc] Ошибка 2 make: ***[все] Ошибка 2

Я удивлен, что я не могу с этим справиться, потому что когда я запускаю эту версию 'ld', я получаю следующий вывод:

/ Developer / Cocotron / 1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld: поддерживаемые цели: elf64-x86-64-freebsd elf32-i386-freebsd coff-i386 efi-app-ia32 efi-bsdrv-ia32 efi-rtdrv-ia32 efi-app-x86_64 efi-bsdrv-x86_64 efi-rtdrv-x86_64 elf32-i386 elf64-x86-64 elf64-маленький elf64-большой elf32-маленький elf32-big srec symbolsrec texhex binary ihex /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld:поддерживаемые эмуляции: elf_x86_64_fbsd elf_i386_fbsd elf_x86_64 elf_i386 /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/x86_64-pc-freebsd7/bin/ld: специальные параметры эмуляции * elf_x64_10: * * * * *что я собрал binutils правильно ... но он не может обработать библиотеку, являющуюся 64-битным совместно используемым объектом FreeBSD x86-64 ELF ??

Чтобы дать историю с самого начала - сборка binutils кажется безупречной.

При компиляции GMP и MPFR у меня возникают некоторые проблемы с ranlib, которые меня беспокоят, при попытке создать библиотеку .a, но в файлах .o нет символов ... это может быть нормально, но я не могу сказать,?

GMP:

/usr/bin/ranlib: file: .libs/libprintf.a(obprintf.o) has no symbols
/usr/bin/ranlib: file: .libs/libprintf.a(obvprintf.o) has no symbols
/usr/bin/ranlib: file: .libs/libprintf.a(obprntffuns.o) has no symbols
/usr/bin/ranlib: file: .libs/libprintf.a(repl-vsnprintf.o) has no symbols
ranlib .libs/libprintf.a
ranlib: file: .libs/libprintf.a(obprintf.o) has no symbols
ranlib: file: .libs/libprintf.a(obvprintf.o) has no symbols
ranlib: file: .libs/libprintf.a(obprntffuns.o) has no symbols
ranlib: file: .libs/libprintf.a(repl-vsnprintf.o) has no symbols
</blockquote>

И я получу еще немного дальше ..

ranlib /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(mp_clz_tab.o) has no symbols
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(obprintf.o) has no symbols
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(obvprintf.o) has no symbols
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(obprntffuns.o) has no symbols
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libgmp.a(repl-vsnprintf.o) has no symbols

MPFR:

Аналогичная сделка:

<blockquote></p>

<p>/usr/bin/ranlib: file: .libs/libmpfr.a(volatile.o) has no symbols
/usr/bin/ranlib: file: .libs/libmpfr.a(mp_clz_tab.o) has no symbols
/usr/bin/ranlib: file: .libs/libmpfr.a(logging.o) has no symbols
/usr/bin/ranlib: file: .libs/libmpfr.a(set_d64.o) has no symbols
/usr/bin/ranlib: file: .libs/libmpfr.a(get_d64.o) has no symbols
ranlib .libs/libmpfr.a
ranlib: file: .libs/libmpfr.a(volatile.o) has no symbols
ranlib: file: .libs/libmpfr.a(mp_clz_tab.o) has no symbols
ranlib: file: .libs/libmpfr.a(logging.o) has no symbols
ranlib: file: .libs/libmpfr.a(set_d64.o) has no symbols
ranlib: file: .libs/libmpfr.a(get_d64.o) has no symbols
creating libmpfr.la

И чуть дальше ..

<blockquote>
ranlib /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(volatile.o) has no symbols
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(mp_clz_tab.o) has no symbols
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(logging.o) has no symbols
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(set_d64.o) has no symbols
ranlib: file: /Developer/Cocotron/1.0/FreeBSD/x86_64/gcc-4.3.1/lib/libmpfr.a(get_d64.o) has no symbols

Затем мы переходим к GCC, предположительно с хорошими binutils, GMP и MPFR ... но, наконец, во время сборки gcc (в частности, libgcc) я получаю ошибку линковки ld.


Дополнительная информация:

Я компилирую binutils, используя:

<blockquote>CFLAGS="-m32 -Wformat=0 -Wno-error=deprecated-declarations" $sourceFolder/binutils-$binutilsVersion/configure --prefix="$resultFolder" --target=$compilerTarget $binutilsConfigureFlags

Однако при переключении на -m64 .. * 1070 я сталкиваюсь с той же проблемой*

<blockquote>CFLAGS="-m64 -Wformat=0 -Wno-error=deprecated-declarations" $sourceFolder/binutils-$binutilsVersion/configure --prefix="$resultFolder" --target=$compilerTarget $binutilsConfigureFlags

Я компилирую GMP и MPFR, используя:

<blockquote>ABI=32 $sourceFolder/gmp-$gmpVersion/configure --prefix="$resultFolder"

Я компилирую GCC, используя:

<blockquote>
        CFLAGS="-m32" $sourceFolder/gcc-$gccVersion/configure -v --prefix="$resultFolder" --target=$compilerTarget \
                --with-gnu-as --with-gnu-ld --with-headers=$resultFolder/$compilerTarget/include \
                --without-newlib --disable-multilib --disable-libssp --disable-nls --enable-languages="$enableLanguages" \
                --with-gmp=$buildFolder/gmp-$gmpVersion --enable-decimal-float --with-mpfr=$resultFolder --enable-checking=release \
                --enable-objc-gc \<br>
                $compilerConfigureFlags<br>

Для всего этого я использую:

<blockquote>
compilerTarget=x86_64-pc-freebsd7
compilerConfigureFlags="--enable-version-specific-runtime-libs --enable-shared --enable-threads=posix --disable-checking --disable-libunwind-exceptions --with-system-zlib --enable-__cxa_atexit"
binutilsConfigureFlags="--enable-64-bit-bfd"

В моей целевой системе FreeBSD, которая, кстати, является стандартной FreeBSD 8.2 RELEASE amd64, ld указывает на возможности, очень похожие на мою кросс-компиляцию.На самом деле, кажется, что ld моей кросс-компилируемой среды обрабатывает расширенный набор того, что обрабатывает ld фактической цели - заставляя меня думать, что я смогу обрабатывать любые файлы без несовместимости, которую я вижу

<blockquote>
ld: supported targets: elf64-x86-64 efi-app-ia32 elf32-i386-freebsd srec symbolsrec tekhex binary ihex
ld: supported emulations: elf_i386_fbsd elf_x86_64_fbsd
ld: emulation specific options:
elf_i386_fbsd: 

1 Ответ

2 голосов
/ 02 июня 2011

64-битная библиотека может быть связана только с 64-битным объектным кодом. Вам нужно -m64 для построения 64-битного объектного кода, -m32 производит 32-битный объектный код.

...