Total Pageviews

Monday, 14 August 2017

在64位linux系统,执行32位程序的解决方法

在64位机器上安装32位程序的运行库,由于64位CPU兼容32位指令集,因此.此方式最为合适.

安装32位的运行库
ubuntu(debain系列)的linux可以按照以下方式安装。(注意前边的命令提示符是’#’也就是说我是用root运行的,如果不愿意用root运行的话需要加 sudo)
dpkg --add-architecture i386
apt-get install -y lib32ncurses5 lib32stdc++6 lib32z1


If fails, do also
sudo apt-get install -y multiarch-support
After these steps, you should be able to run the 32-bit application:
./example32bitprogram
 (参考https://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit)

如果没有ia32-libs,就用
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install lib32ncurses5 lib32z1
-------------

如果你确定你执行的是32位程序,而你是64位系统,则出现No such file or directory错误就是因为你缺少了32位的库文件。解决方法也很简单:

对于Arch Linux用户:
添加下面几行到 /etc/pacman.conf 启用该软件仓库:
    [multilib]
    Include = /etc/pacman.d/mirrorlist

然后执行:
    sudo pacman -Syy
    sudo pacman -S lib32-glibc


对于Ubuntu用户:见上部分。

对于fedora用户:
    sudo yum install glibc.i686
         
对于centos用户:
yum install ncurses-libs.i686 libstdc++.i686 libgcc.i686

一般的程序就可以运行了,当然也可能还需要一些其它的32位库,可根据实际情况来解决.
--------------------

在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

from http://blog.csdn.net/xsckernel/article/details/38045783

No comments:

Post a Comment