web-dev-qa-db-ja.com

x86_64マシンでglibc 32ビットをコンパイルする方法

私はglibcを(システムの代替ではなくセカンダリとして)2.6をx86_64でコンパイルしようとしています。それを取得して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の--targetを混乱させていたようです。代わりに--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

みんな、ありがとう!

19
royh

質問を編集しましたが、適切な方法は回答を追加することです。これが最終的に機能したものです:

 $ ../../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 CFLAGSまたはCXXFLAGSの代わりにCCおよびCXXで重要でした。CFLAGSまたはCXXFLAGSを使用しないコンパイル操作が少なくとも1つあったため、-m32絶対に常にそこにいる必要があります。理由がわからない-march=i686が必要でした(-m32パーツと--Host/buildオプション)ですが、そうでした。

26
royh

次は私のために働きます:

../../src/glibc-2.6/configure --prefix=$HOME/glibc32-2.6 \
 CC="gcc -m32" CXX="g++ -m32" i686-linux-gnu
5

3つの重要な./configureフラグ:

  • --build=ビルドを実行するシステム。あなたの名前はx86_64-pc-linux-gnuのようです。
  • --Host=生成されたオブジェクトが使用されるシステム。これをi386-pc-linux-gnuに設定します。
  • --target=コンパイラーをビルドしている場合、ビルドされたコンパイラーがオブジェクトを生成するシステム。

クロスコンパイルを実行するには、両方--build=および--Host=を指定する必要があります。 --Host=のみを指定した場合でも、ネイティブ(x86_64)glibcの構築が試行されます。

4
ephemient