title: Ubuntu 64位编译32位程序
背景
一般情况下,一个平台上只能编译当前平台对应的应用程序,比如,64位平台编译64位应用程序,但是随着64位平台的普及,多数采用了64位操作系统,而有时又基于某些原因需要编译出32位的应用程序.
本文旨在说明如何在64位操作系统上编译出32位应用程序.
准备
- 确认主机为64位架构的内核,应该输出为amd64
$ dpkg --print-architecture #amd64
- 确认打开了多架构支持功能,应该输出为i386
$ dpkg --print-foreign-architectures #i386
# 如果没有,则需要手动打开,依次执行:
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get dist-upgrade
- 安装gcc multilab
sudo apt-get install gcc-multilab g++-multilib
用gcc编译时,需要添加-m32选项,但是在引用外部库的情况下,需要采用使用-m elf_i386参数可以使得64位的ld能够兼容32位的库. 但是编译时是使用自己的一个命令,所以没有办法给他加参数,但是这个命令也是要调用gcc和ld得,所以我们可以通过修改gcc和ld来解决,也就是将上述的两个支持32位编译连接的参数默认给加上去:
- 将/usr/bin/gcc和/usr/bin/ld都改名为*.bin,就是改为: /usr/bin/gcc.bin和/usr/bin/ld.bin
- 创建脚本/usr/bin/gcc:
- 创建脚本/usr/bin/ld:
#!/bin/sh
ld.bin -m elf_i386 $@
这样就保证调用时将需要的参数加上,然后再调用真正的参数.
每次在32位编译和64位编译之间切换的时候都要用mv指令移动,会很麻烦,可以用如下脚本来完成:
#!/bin/sh
mv -i /usr/bin/gcc /usr/bin/gcc.sh
mv -i /usr/bin/ld /usr/bin/ld.sh
mv -i /usr/bin/gcc.bin /usr/bin/gcc
mv -i /usr/bin/ld.bin /usr/bin/ld
#!/bin/sh
mv -i /usr/bin/gcc /usr/bin/gcc.bin
mv -i /usr/bin/ld /usr/bin/ld.bin
mv -i /usr/bin/gcc.sh /usr/bin/gcc
mv -i /usr/bin/ld.sh /usr/bin/ld
执行脚本后,直接采用gcc编译即可.
参考资料: