Ubuntu 64位编译32位程序

5 篇文章 0 订阅

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值