在 64 位系统上编译 32 位

在 64 位系统上编译 32 位

我正在尝试使用以下配置命令在 64 位 ubuntu 系统上编译 32 位版本的 python:

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

然后 make,make install。没有错误,但应该是出了什么问题,因为“readelf -h python”告诉我 python 是作为 ELF64 构建的。

答案1

使用“--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]

你需要使用

./configure --build=x86_64-pc-linux-gnu --host=i386-pc-linux-gnu

在 64 位 Linux 系统中编译 32 位 Linux。您仍需要添加其他./configure选项。

答案2

这就是我在 Ubuntu 16 上构建和安装 32 位 Python 3.5.2 的方法,其中 64 位版本已经通过 apt 安装了:

# 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

答案3

如果您希望对编译进行调试,则应将 gcc 的详细输出发布到 pastebin 中。否则,不可能知道。

建议使用 chroot 的解决方案可能会对你有帮助,Mikko 也提供了一个链接来指导用户如何在 64 位机器上使用 32 位 Python 的 chroot

相关内容