64bit Linux CentOS 7下编译32bit程序的方法

本文记录的方法理论上适用于所有RedHat系Linux发行版!
一般在64位Linux下(安装好gcc等相关编译工具后)编译出的执行程序都是针对64位环境的,如果想编译为针对32位环境的(当然,64位系统环境下也可以兼容运行),只需要在执行gcc时加上-m32编译即可(ld的话也有对应参数-melf_i386),虽然编译时只是加参数即可,但仍然有c、c++标准库等需要首先安装好32位相关版本。
如下,如果直接-m32编译的话,会收到如下错误提示:

[kres@localhost test6432]$ gcc -m32 test.c
In file included from /usr/include/features.h:399:0,
from /usr/include/unistd.h:25,
from /usr/include/usb.h:28,
from test.c:1:
/usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录
# include ;
^
编译中断。


下面要安装i686相关的标准库(CentOS 7对应i686,旧版本对应i386等)

sudo yum install glibc-devel.i686

执行后安装了如下文件:

=========================================================================================================================================
Package 架构 版本 源 大小
=========================================================================================================================================
正在安装:
glibc-devel i686 2.17-78.el7 base 1.0 M
为依赖而安装:
glibc i686 2.17-78.el7 base 4.2 M
nss-softokn-freebl i686 3.16.2.3-13.el7_1 updates 187 k
为依赖而更新:
nss-softokn-freebl x86_64 3.16.2.3-13.el7_1 updates 204 k

事务概要
=========================================================================================================================================
安装 1 软件包 (+2 依赖软件包)
升级 ( 1 依赖软件包)

总下载量:5.6 M
Is this ok [y/d/N]: y

安装之后再次执行gcc,又会得到下面的错误:

[kres@localhost test6432]$ gcc -m32 test.c
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.8.3/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: 错误:ld 返回 1

还要继续安装相关库,执行:

sudo yum install libstdc++-devel.i686

执行后安装了如下文件:

=========================================================================================================================================
Package 架构 版本 源 大小
=========================================================================================================================================
正在安装:
libstdc++-devel i686 4.8.3-9.el7 base 1.5 M
为依赖而安装:
libgcc i686 4.8.3-9.el7 base 99 k
libstdc++ i686 4.8.3-9.el7 base 307 k

事务概要
=========================================================================================================================================
安装 1 软件包 (+2 依赖软件包)

总下载量:1.9 M
安装大小:9.0 M

完成后再次编译即可顺利通过,使用file对a.out查看,可以发现如下的32位与64位执行程序对比:

a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x6788cf8e9553f2e948ac8ecd51891bdbdab7e076, not stripped

a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0x5921d6f995d0d4668cde23339558fb2db926e622, not stripped

参考文章:

博主友情提示:

如在您的评论中需要提及如QQ号、微信号、电子邮件地址或其他隐私敏感信息,欢迎通过>>博主专用加密工具v2<<加密后发布,原文只有博主可以看到。