Ubuntu 64位编译32位程序

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编译即可.

参考资料:

https://blog.csdn.net/XscKernel/article/details/38045783

https://blog.csdn.net/fengbingchun/article/details/50924311

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章