在64位linux下编译32位程序

时间:2020-12-16 03:36:22
    一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序。

   现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM64T)已经开始广泛的使用起来了,甚至于你现在要是想买32位的处理器根本就没有。64位的系统在性能和处理能力上相对32位系统也都有很大的提高。所以现在很多用户已经选择使用64位的系统了。

    有一些软件,在安装过程中需要对部分代码进行编译以便在不同的发布版本都可以很好的运行。那么当我们在64位系统上安装32位的软件时,它的编译就会出错,因为软件的二进制部分是32位的,但是编译出来的部分是64位的,所以我们就需要让我们的64位系统可以编译32位的程序,并且需要默认就是编译32位的程序。

   通过查阅资料,发现可以使用-m32来使得gcc编译32位程序(在x86_64系统上),使用-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:

#!/bin/sh

gcc.bin -m32 $@


/usr/bin/ld:

#!/bin/sh

ld.bin -m elf_i386 $@

  这样就保证调用时将需要的参数加上,然后再调用真正的参数($@表示当前命令的所有参数,也就是把传给教本的所有参数再传给真正的命令),经测试可以解决问题。

可以用一个简单的C代码测试一下:

/* test.c */
#include <stdio.h>
int main()
{
printf("sizeof long is %d\n", sizeof(long));
return 0;
}
$ gcc test.c$ file a.outa.out: ELF 64-bit LSB executable ...$ ./a.outsizeof long is 8
   32位编译执行结果 (在64位系统编译32位程序需要给 GCC 加 -m32 参数):

$ gcc -m32 test.c
$ file a.out
a.out: ELF 32-bit LSB executable ...
$ ./a.out
sizeof long is 4

另外说明下在ubuntu上如果要用 -m32 参数就要 安装如下的库:

$ sudo apt-get install build-essential module-assistant
$ sudo apt-get install gcc-multilib g++-multilib

如果每次在32位编译和64位编译之间切换的时候都要用mv指令移动,会很麻烦,可以用如下脚本来完成:

如果要64位编译那么就用gcc64.sh

#!/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

如果用32位编译那么就用gcc32.sh:

#!/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


参考链接:

http://blog.sina.com.cn/s/blog_542ecc79010007gh.html