Как скомпилировать 32-битную glibc на машине x86_64

Я пытаюсь скомпилировать 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 
 

Всем спасибо!

19
задан royh 5 November 2011 в 02:51
поделиться