在64位linux下编译32位程序

简介: 一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序。    现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM64T)已经开始广泛的使用起来了,甚至于你现在要是想买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代码测试一下:

 

[cpp]  view plain  copy
 
 print?
  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月前
|
安全 Linux iOS开发
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
669 6
Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10 - Nessus 自动化安装程序
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
997 2
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
3402 14
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
1034 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
630 0
|
Linux 开发工具
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
553 0
|
Linux
如何查看linux是32位还是64位
如何查看linux是32位还是64位
232 0