在64位linux下编译32位程序

一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在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:

[plain]  view plain copy print ?
  1. #!/bin/sh  
  2.   
  3. gcc.bin -m32 $@  


/usr/bin/ld:

[plain]  view plain copy print ?
  1. #!/bin/sh  
  2.   
  3. ld.bin -m elf_i386 $@  

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

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

  1. /* test.c */  
  2. #include <stdio.h>  
  3. int main()  
  4. {  
  5.     printf("sizeof long is %d\n"sizeof(long));  
  6.     return 0;  
  7. }  
[plain]  view plain copy print ?
  1. $ gcc test.c  
  2. $ file a.out  
  3. a.out: ELF 64-bit LSB executable ...  
  4. $ ./a.out  
  5. sizeof long is 8  
   32位编译执行结果 (在64位系统编译32位程序需要给 GCC 加 -m32 参数):

[plain]  view plain copy print ?
  1. $ gcc -m32 test.c  
  2. $ file a.out  
  3. a.out: ELF 32-bit LSB executable ...  
  4. $ ./a.out  
  5. sizeof long is 4  

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

[plain]  view plain copy print ?
  1. $ sudo apt-get install build-essential module-assistant  
  2. $ sudo apt-get install gcc-multilib g++-multilib  

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

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

[plain]  view plain copy print ?
  1. #!/bin/sh  
  2.   
  3. mv -i /usr/bin/gcc /usr/bin/gcc.sh  
  4. mv -i /usr/bin/ld  /usr/bin/ld.sh  
  5.   
  6. mv -i /usr/bin/gcc.bin /usr/bin/gcc  
  7. mv -i /usr/bin/ld.bin  /usr/bin/ld  

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

[plain]  view plain copy print ?
  1. #!/bin/sh  
  2.   
  3. mv -i /usr/bin/gcc /usr/bin/gcc.bin  
  4. mv -i /usr/bin/ld  /usr/bin/ld.bin  
  5.   
  6. mv -i /usr/bin/gcc.sh /usr/bin/gcc  
  7. mv -i /usr/bin/ld.sh  /usr/bin/ld  


参考链接:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值