[英]How to compile glibc 32bit on an x86_64 machine
我正在嘗試在x86_64上編譯glibc(作為輔助,而不是系統替換)2.6,並試圖讓它生成32位對象。 當我給它一個標准配置時,它編譯得很好,產生通常的64位庫對象。 一些信息:
$ uname -a Linux localhost.localdomain 2.6.18-164.11.1.el5 #1 SMP Wed Jan 20 07:32:21 \\ EST 2010 x86_64 x86_64 x86_64 GNU/Linux $ cat /etc/redhat-release CentOS release 5.4 (Final)
除其他外,我嘗試了以下內容:
嘗試1:
$ # [in build/glibc-2.6] $ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \\ --with-cpu=i386-pc-linux-gnu ... checking sysdep dirs... configure: error: The i386-pc-linux-gnu subspecies of x86_64 is not supported."
嘗試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 support is required." In file included from include/tls.h:6, from sysdeps/unix/sysv/linux/i386/sysdep.h:30, from <stdin>:1:
如果我添加--with-tls和/或--target = i386-pc-linux-gnu,我會得到相同的結果。
[編輯:看起來我很困惑 - 為--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 \\ ... In file included from ./../include/libc-symbols.h:55, from <command line>:1: /home/USER/build/glibc32-2.6/config.h:3:3: error: #error "glibc cannot be \\ compiled without optimization"
同樣,使用--with-tls也會發生同樣的事情
嘗試4:
$ CFLAGS="-m32 -O2" \\ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \\ --host=i386-pc-linux-gnu \\ ... gcc ../sysdeps/unix/sysv/linux/i386/sysdep.S -c -I../include \\ -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 \\ -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 \\ -MF /home/USER/build/glibc32-2.6/csu/sysdep.o.dt \\ -MT /home/USER/build/glibc32-2.6/csu/sysdep.o ../sysdeps/unix/i386/sysdep.S: Assembler messages: ../sysdeps/unix/i386/sysdep.S:51: Error: @NTPOFF reloc is not supported \\ with 64-bit output format ../sysdeps/unix/i386/sysdep.S:51: Error: junk `@NTPOFF' after expression
我覺得這應該更容易。 我錯過了什么嗎?
如果您需要更多信息,請告訴我,我會提供。
[編輯]
嘗試5(由EmployedRussian建議)
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \\ CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu ... 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: In function `add_dependency': /home/USER/src/glibc-2.6/elf/dl-lookup.c:106: undefined reference to `__sync_fetch_and_add_4' /home/USER/src/glibc-2.6/elf/dl-lookup.c:110: undefined reference to `__sync_val_compare_and_swap_4' /home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_profile_fixup': /home/USER/src/glibc-2.6/elf/dl-runtime.c:196: undefined reference to `__sync_val_compare_and_swap_4' /home/USER/src/glibc-2.6/elf/dl-runtime.c:205: undefined reference to `__sync_fetch_and_add_4' /home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_fixup': /home/USER/src/glibc-2.6/elf/dl-runtime.c:102: undefined reference to `__sync_val_compare_and_swap_4' /home/USER/src/glibc-2.6/elf/dl-runtime.c:110: undefined reference to `__sync_fetch_and_add_4' /home/USER/build/glibc32-2.6/elf/librtld.os: In function `dl_open_worker': /home/USER/src/glibc-2.6/elf/dl-open.c:425: undefined reference to `__sync_val_compare_and_swap_4' /home/USER/src/glibc-2.6/elf/dl-open.c:427: undefined reference to `__sync_fetch_and_add_4' /home/USER/build/glibc32-2.6/elf/librtld.os: In function `_dl_close_worker': /home/USER/src/glibc-2.6/elf/dl-close.c:407: undefined reference to `__sync_val_compare_and_swap_4' /home/USER/src/glibc-2.6/elf/dl-close.c:409: undefined reference to `__sync_fetch_and_add_4' collect2: ld returned 1 exit status make[2]: *** [/home/USER/build/glibc32-2.6/elf/ld.so] Error 1 make[2]: Leaving directory `/home/USER/src/glibc-2.6/elf' make[1]: *** [elf/subdir_lib] Error 2 make[1]: Leaving directory `/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
感謝大家!
我編輯了這個問題,但后來我意識到正確的方法是添加一個答案。 這是最終起作用的:
$ ../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
--host=i686-linux-gnu \
--build=i686-linux-gnu \
CC="gcc -m32" CXX="g++ -m32" \
CFLAGS="-O2 -march=i686" \
CXXFLAGS="-O2 -march=i686"
我認為將-m32
放在CC和CXX而不是CFLAGS和CXXFLAGS非常重要,因為在make期間至少有一個編譯操作沒有使用CFLAGS或CXXFLAGS,並且-m32
絕對必須始終存在。 不確定為什么-march=i686
是必要的(給定-m32
部分和--host/build
選項),但它確實如此。
以下適用於我:
../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu
三個重要的./configure
標志:
--build=
執行構建的系統。 看起來你的是x86_64-pc-linux-gnu
。 --host=
將使用生成的對象的系統。 你想把它設置為i386-pc-linux-gnu
。 --target=
如果要構建編譯器,則構建的編譯器將為其生成對象的系統。 要進行交叉編譯,必須指定 --build=
和--host=
。 當您只指定--host=
,它仍將嘗試構建本機( x86_64
)glibc。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.