web-dev-qa-db-ja.com

64ビットシステムで32ビットをコンパイルする

次のconfigureコマンドを使用して、64ビットのubuntuシステムでpythonの32ビットバージョンをコンパイルしようとしています。

CC="gcc -m32" LDFLAGS="-L/lib32 -L/usr/lib32 \ -Lpwd/lib32 -Wl,-rpath,/lib32 \
    -Wl,-rpath,/usr/lib32" \ ./configure --prefix=/opt/pym32

その後、インストールしてください。エラーはありませんが、「readelf -h python」はpythonが代わりにELF64としてビルドされたことを示しているため、何か間違っているはずです。

2
Gabriele B

「--build」と「--Host」を使用します。

./configure --help
System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --Host=HOST       cross-compile to build programs to run on Host [BUILD]

64ビットLinuxシステムで32ビットLinux用にコンパイルするには、./configure --build=x86_64-pc-linux-gnu --Host=i686-pc-linux-gnuを使用する必要があります。他の./configureオプションを追加する必要があります。

4
Arnel A. Borja

これが、Ubuntu 16に32ビットPython 3.5.2をビルドおよびサイドインストールする方法で、aptによって64ビットバージョンが既にインストールされています。

# Some prerequisites:
Sudo apt install libffi-dev:i386
Sudo apt install libssl1.0.0:i386
Sudo apt install libssl-dev:i386
Sudo apt-get install libncurses-dev:i386 libreadline-dev:i386 # for command history to work in Python terminal
Sudo apt-get install binutils-multiarch
Sudo ln -s /usr/bin/readelf /usr/bin/i386-linux-gnu-readelf
# Going to be installed to /opt/python-3.5.2-i386
ac_cv_file__dev_ptc=no ac_cv_file__dev_ptmx=yes \
CFLAGS=-m32 CXXFLAGS=-m32 \
LDFLAGS="-m32 -L/lib32 -L/usr/lib32 -L/lib/i386-linux-gnu -L/usr/lib/i386-linux-gnu -Wl,-rpath,/lib32 -Wl,-rpath,/usr/lib32 -Wl,-rpath,/lib/i386-linux-gnu -Wl,-rpath,/usr/lib/i386-linux-gnu" \
./configure --build=x86_64-linux-gnu --Host=i386-linux-gnu \
--enable-ipv6 --prefix=/opt/python-3.5.2-i386 --with-system-ffi
make
Sudo make install
# The following may be needed to build some additional extensions, which are statically 
# built-in in existing python3 intallation on Host and won't be built otherwise
Sudo PATH=/opt/python-3.5.2-i386/bin:$PATH make
Sudo PATH=/opt/python-3.5.2-i386/bin:$PATH make install

その後:

~$ python3 -V
Python 3.5.2
~$ python3 -c 'import struct; print(struct.calcsize("P") * 8)'
64
~$ /opt/python-3.5.2-i386/bin/python3 -V
Python 3.5.2
~$ /opt/python-3.5.2-i386/bin/python3 -c 'import struct; print(struct.calcsize("P") * 8)'
32
1
Alex Che

コンパイルをデバッグする場合は、gccからの詳細な出力を(Pastebinに)ポストする必要があります。そうでなければ、知ることは不可能です。

Chrootを使用する提案された解決策が役立つ場合があり、Mikkoは 2ビットpythonで64ビットマシンでchrootを使用する方法