Я пытаюсь скомпилировать glibc (в качестве вторичной, а не системной замены) 2.6 на x86_64 и пытаюсь заставить его создать 32-разрядную версию. объекты. Когда я даю ему стандартную конфигурацию, он отлично компилируется, создавая обычные 64-битные библиотечные объекты. Некоторая информация:
$ uname -a Linux localhost.localdomain 2.6.18-164.11.1.el5 # 1 SMP среда 20 января 07:32:21 \ {1}} EST 2010 x86_64 x86_64 x86_64 GNU / Linux $ cat / etc / redhat-release CentOS release 5.4 (Final)
Среди прочего, я пробовал следующее :
Попытка 1:
$ # [в build / glibc-2.6] $ ../../src/glibc-2.6/configure --prefix = $ HOME / glibc32-2.6 \ --with-cpu = i386-pc-linux-gnu ... проверка каталогов sysdep ... configure: error : Подвид i386-pc-linux-gnu для x86_64 не поддерживается."
Попытка 2:
$ ../../src/glibc-2.6/configure --prefix = $ HOME / glibc32-2.6 \ --host = i386 -pc-linux-gnu ... $ make
Настройка выполняется успешно, но make
вызывает поток ошибок компиляции, которые все выглядят следующим образом:
nptl / sysdeps / i386 / tls.h: 65: 3: error: #error «Требуется поддержка TLS». В файле, включенном из include / tls.h: 6, из sysdeps / unix / sysv / linux / i386 / sysdep.h: 30, из
: 1:
Я получу тот же результат, если добавлю --with-tls и / или --target = i386-pc-linux-gnu.
[РЕДАКТИРОВАТЬ: Похоже как будто я запутал --target для --build. Вместо этого я попытался добавить --build = i386-pc-linux-gnu, а также для всех других попыток, где я пробовал --target. Во всех случаях я получил точно тот же результат, что и раньше.]
Попытка 3:
$ CFLAGS = -m32 \ ../../src/glibc-2.6/configure --prefix = $ HOME / glibc32-2.6 \ --host = i386-pc-linux-gnu \ ... В файле, включенном из ./../ включить / l ibc-symbols.h: 55, из <командной строки>: 1: / home / USER / build / glibc32-2.6 / config.h: 3: 3: error: #error " glibc не может быть \ скомпилирован без оптимизации "
И снова то же самое происходит с --with-tls
Попытка 4:
$ CFLAGS =" - m32 -O2 "\ ../../src/glibc-2.6/configure --prefix = $ HOME / glibc32-2.6 \ --host = i386-pc-linux-gnu \ {{ 1}} ... gcc ../sysdeps/unix/sysv/linux/i386/sysdep.S -c -I ../ include \ {{1 }} -I / home / USER / build / glibc32-2.6 / csu \ -I / home / USER / build / glibc32-2.6 -I ../ sysdeps / i386 / elf \ -I ../ nptl / sysdeps / unix / sysv / linux / i386 \ -I ../ sysdeps / unix / sysv / linux / i386 \ -I ../ nptl / sysdeps / unix / sysv / linux \ -I ../ nptl / sysdeps / pthread -I ../ sysdeps / pthread \ -I ../ sysdeps / unix / sysv / linux -I ../ sysdeps / gnu \ -I ../ sysdeps / unix / common -I ../ sysdeps / unix / mman \ -I ../ sysdeps / unix / inet -I .. / sysdeps / unix / sysv / i386 \ -I ../ nptl / sysdeps / unix / sysv -I ../ sysdeps / unix / sysv \ -I ../ sysdeps / unix / i386 -I ../ nptl / sysdeps / unix \ -I ../ sysdeps / unix -I ../ sysdeps / posix \ -I ../ sysdeps / i386 / fpu -I ../ nptl / sysdeps / i386 \ -I ../ sysdeps / i386 -I ../ sysdeps / wordsize-32 \ -I ../ sysdeps / ieee754 / ldbl -96 \ -I ../ sysdeps / ieee754 / dbl-64 \ -I ../ sysdeps / ieee754 / flt-32 -I ../ sysdeps / ieee754 \ {1 }} -I ../ sysdeps / generic / elf -I ../ sysdeps / generic \ -I ../ nptl -I .. -I ../ libio -I. \ -D_LIBC_REENTRANT -include ../include/libc-symbols.h \ -DHAVE_INITFINI -DASSEMBLER \ -I / home / USER / build / glibc32-2.6 / csu /. -DGAS_SYNTAX \ -Wa, - noexecstack \ -o /home/USER/build/glibc32-2.6/csu/sysdep.o \ -MD -MP \ { {1}} -MF /home/USER/build/glibc32-2.6/csu/sysdep.o.dt \ -MT /home/USER/build/glibc32-2.6/csu/sysdep.o {{ 1}} ../ sysdeps / unix / i386 / sysdep.S: Сообщения ассемблера: ../ sysdeps / unix / i386 / sysdep.S: 51: Ошибка: @NTPOFF reloc is не поддерживается \ с 64-битным форматом вывода ../ sysdeps / unix / i386 / sysdep.S: 51: Ошибка: мусор `@NTPOFF 'после выражения
Я чувствую, что это должно быть проще. Я что-то упускаю?
Если вам нужна дополнительная информация, дайте мне знать, и я ее предоставлю.
[EDIT]
Попытка 5 (предложена EmployedRussian)
$ ../../src/glibc-2.6/configure --prefix = $ HOME / glibc32-2.6 \ CC = "gcc -m32" CXX = "g ++ -m32" i686-linux-gnu ... { {1}} gcc -m32 -nostdlib -nostartfiles -shared \ -o /home/USER/build/glibc32-2.6/elf/ld.so -Wl, -z, combreloc - Wl, -z, relro -Wl, - hash-style = both -Wl, -z, defs /home/USER/build/glibc32-2.6/elf/librtld.os \ -Wl, - version-script = / home / USER / build / glibc32-2.6 / ld.map \ -Wl, -soname = ld-linux.so.2 \ -T /home/USER/build/glibc32-2.6/elf/ld.so.lds / home / USER / build / glibc32-2.6 / elf / librtld.os: в функции `add_dependency ': / home / USER / src / glibc-2.6 / elf / dl-lookup .c: 106: неопределенная ссылка на `__sync_fetch_and_add_4 ' / home / USER / src / glibc-2.6 / elf / dl-lookup.c: 110: неопределенная ссылка на` __sync_val_compare_and_swap_4' / home /USER/build/glibc32-2.6/elf/librtld.os: В функции `_dl_profile_fixup ': / home / USER / src / glibc-2.6 / elf / dl-runtime.c: 196: неопределенная ссылка на `__sync_val_compare_and_swap_4 ' / home / USER / src / glibc-2.6 / elf / dl-runtime.c: 205: неопределенная ссылка на` __sync_fetch_and_add_4' / home / USER / build / glibc32-2.6 /elf/librtld.os: В функции `_dl_fixup ': / home / USER / src / glibc-2.6 / elf / dl-runtime.c: 102: неопределенная ссылка на` __sync_val_compare_and_swap_4' /home/USER/src/glibc-2.6/elf/dl-runtime.c:110: неопределенная ссылка на `__sync_fetch_and_add_4 ' / home / USER / build / glibc32-2.6 / elf / librtld.os: In функция `dl_open_worker ': / home / USER / src / glibc-2.6 / elf / dl-open.c: 425: неопределенная ссылка t o `__sync_val_compare_and_swap_4 ' / home / USER / src / glibc-2.6 / elf / dl-open.c: 427: неопределенная ссылка на` __sync_fetch_and_add_4' / home / USER / build / glibc32- 2.6 / elf / librtld.os: в функции `_dl_close_worker ': / home / USER / src / glibc-2.6 / elf / dl-close.c: 407: неопределенная ссылка на` __sync_val_compare_and_swap_4' {{1} } /home/USER/src/glibc-2.6/elf/dl-close.c:409: undefined ссылка на `__sync_fetch_and_add_4 ' collect2: ld вернул 1 статус выхода make [2]: *** [/home/USER/build/glibc32-2.6/elf/ld.so] Ошибка 1 make [2]: выход из каталога `/home/USER/src/glibc-2.6/elf '{ {1}} make [1]: *** [elf / subdir_lib] Ошибка 2 make [1]: выход из каталога `/ home / USER / src / glibc-2.6 ' make: *** [all] Error 2
На этот раз сборка выполняется успешно в течение долгого времени, прежде чем произойдет ошибка. Я провел поиск и нашел что-то, что подсказывает мне добавить флаг "-march", что я и сделал. В итоге это сработало:
Попытка 6:
$ ../../src/glibc-2.6/configure --prefix = $ HOME / glibc32-2.6 \ CC = "gcc -m32" CXX = "g ++ -m32" \ CFLAGS = "- O2 -march = i686" \ CXXFLAGS = "- O2 -march = i686" \ i686-linux-gnu
Всем спасибо!