在64位linux下编译32位程序

在64位主机上生成32位目标代码的编译过程 在进行跨平台开发或者与特定系统兼容性要求的项目中,有时候需要在64位主机上生成32位目标代码。请注意,为了成功生成32位目标代码,您的系统上需要安装32位支持的库文件。除了使用GCC编译器,其他编译器也提供了类似的选项来生成32位目标代码。下面以C语言为例,介绍如何通过GCC编译器在64位主机上生成32位目标代码。通过以上步骤,您可以在64位主机上成功生成32位目标代码,以满足特定的兼容性需求或跨平台开发的要求。执行上述命令后,GCC将根据指定的选项和源代码文件生成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:

#!/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.out
a.out: ELF 64-bit LSB executable ...
$ ./a.out
sizeof 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










浅显易懂地看LLC变换器(三) 第3期 谐振与增益的定性关系 由简单的谐振电路说起 我们将以电感和电容的基本电路的特性逐渐了解谐振电路的特性 与电阻不同,电感和电容都不是纯阻性线性器件,电感的感抗XL和电容的容抗Xc都与频率有关,当加在电感和电容上的频率发生变化时,它们的感抗XL和容抗Xc会发生变化。 1) 如下图RL电路,当输入源Vin的频率增加时,电感的感抗增大,输出电压减小,增益Gain=Vo/Vin随频率增加而减小。 2) 如下图RC电路,相反,当输入源Vin的频率增加时... 阅读详情

相关推荐

AI应用架构师实战:高等教育智能课程推荐系统开发

性能:选课季并发量达1000QPS,推荐响应时间≤500ms(否则学生不耐烦)。数据隐私:符合《教育数据安全管理规范》,学生姓名、学号等敏感信息需匿名化存储。可扩展性:支持新增课程类型(如MOOC、实践课)、新增数据源(如竞赛获奖记录)。教育AI要“以教为中心”:不能纯技术驱动,要和教育工作者深度合作(如教师参与定义课程的前置关系)。数据是核心:数据质量决定推荐效果,要重视数据治理和隐私保护。持续迭代:教育需求是动态的(如每年新增课程、学生目标变化),要定期收集用户反馈,更新模型和策略。张三。

AI大模型应用之禅 1349

linux 64位编译32位及其64位动态库及其执行程序编译32/64位方法

linux 64位编译32位及其64位动态库及其执行程序编译32/64位方法 文件夹下有如下程序: TcpClientStateOperate.h TcpClientStateOperate.cpp TcpClientInclude.h TcpClientControlOperate.h TcpClientControlOperate.cpp TcpClientCommon.h TcpClientCommon.cpp main.cpp 1.#86_64为64位系统,默认gcc为64位的,会编译出64位的动态

xt18971492243的博客 3812

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

liang007dudu的博客 1万+

64位机器上 编译32位程序

由于程序迁移,需要在64bit开发机上编译32bit的程序。 在64位的机器上编译32位还是62位程序,主要是要编译器和链接器上加上参数据:-m32 (编译32位) -m64(编译64) 在自己的makefile中添加"CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32" 即可 因为项目中用到了boost库,编译32bit boost 命令如下

snake_baoby的专栏 2038

脑机接口最新发展动态报告 (2024-2025)

脑机接口动态

高山 4106

以太网物理层协议整理(2)-万兆以太网

在万兆以太网标准化过程中,IEEE和10GEA(万兆以太网联盟)是两个最重要的组织。 万兆以太网标准和规范都比较繁多,在标准方面,首先有2002年的IEEE 802.3ae,后来也不断有新的万兆以太网规范推出,如2006年的IEEE 802.3an标准(10GBase-T)就推出了基于双绞铜线的万兆以太网规范,同样的IEEE 802.3aq标准推出了基于光纤的10GBase-LRM;2007年的

NowOrNever 3万+

linux 64位操作系统环境下用gcc、g++编译32位程序

在linux 64位操作系统环境下,默认编译生成的可执行文件是64位的。今天由于测试验证需要,需要将程序编译成32位的可执行文件,碰到了一些问题,下面做一下记录。我们有一个test.c,有一个test.cpp,功能都是打印:Hello World。

天道酬勤 6742

【STK】手把手教你利用STK进行光电红外仿真04-STK/EOIR模块的实战操作1航天器星载相机对LEO卫星成像

今天引入一个实际的场景,帮助大家完成对于这个模块的理解与运用。

weixin_44184852的博客 2417

真象还原-碎笔笔记 : C与汇编混合编程 在64位机器上编译出32位可执行代码

很重要的一点:这时候的环境是64位的环境。所以在编译程序的时候要注意编译成32位的。

1710orange的温馨小窝 385

自然语言处理(扩展学习1):Scheduled Sampling(计划采样)与Teacher forcing(教师强制)

作者:安静到无声作者简介:人工智能和硬件设计博士生、优快云与阿里云开发者博客专家,多项比赛获奖者,发表SCI论文多篇。o( ̄▽ ̄)d。

安静到无声 2143

PDD psnl_verification anti_content 生成顺序与环境校验说明

K不是明文 URL,而是从当前href再派生出来的一小段摘要值。页面 URL 变,K会跟着变但K不是直接肉眼可读的 URL 字串可以把它理解成“URL 的短摘要字段”。这一步是最容易被误解的地方。它吃进去的是压缩后的中间串不是直接吃环境字段它内部还带有长度预算 / 字符映射 / 位置处理逻辑所以最终看到的环境字段 bytes协议头deflate 压缩自定义编码多层叠加后的结果。先把字段总包做再把压缩结果转成raw再拼fTail最后走做字符级输出因此,当前看到的协议字段流。

码王吴彦祖的博客 69

编译64位程序 linux,编译64位和编译32位程序

在64位的机器上编译32位还是62位程序,主要是要编译器和链接器上加上参数据:-m32 (编译32位) -m64(编译64)自己写Makefile的话,把上面的标志放到编译器和链接器参数中就可以了。如果用autoconf生成Makefile的话,则要在configure.in中的编译器和链接器变量上加上上面参数:例如:下面例子是编译32位的程序,如果要编译64位的,则把红色的部分换成 -m64#...

weixin_32288959的博客 1198

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

如何在Linux 64位系统下编译32位程序?

随着计算机的不断发展,64位系统渐渐成为了主流,但是我们在编写程序的时候,仍有时候需要编译出32位程序来兼容旧的系统或者是其他32位程序的库,那么在Linux 64位系统下如何编译32位程序呢?

m0_66338176的博客 4374

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

linux系统64位编译32位的库,在64位linux上编译32位程序

在64位linux上编译32位程序[编辑中]-m32# ld -VGNU ld version 2.15.92.0.2 20040927Supported emulations:elf_x86_64elf_i386i386linux#ld -melf_i386Along with the -m32 flag in gcc, you may need to include the -melf_i3...

weixin_34233974的博客 1596

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux 64位 编译32位程序

在64位的Linux下,gcc 编译 32 位程序需要添加参数 -m32  ,ld需要添加参数是 -m elf_i386。例如: gcc  -m32  -o hello  hello.c gcc -m32 -c hello.o hello.c ld -m elf_i38

EvilBinary的专栏 3688

X86_64 Linux系统GCC编译32位程序

如何在64位Linux系统上编译32位程序? gcc编译时,增加下列参数之一: -m32 将int,long和指针设为32位,适用于i386 -m64 将int设为32位,long和指针设为64位,适用于X86-64 -mx32 将int,long和指针设为32位,适用于X86-64 64位系统可以运行32位程序,反之不行。64位系统上编译32位程序时,需要安装lib32的一些库。 ...

aiyo_的博客 1970

64位Linux下编译32位程序

64位 Linux 编译32位应用程序 注:在64位系统编译32位程序需要给 GCC 加 -m32 参数

heyabo 862

linux编译32位的参数,64bit Linux CentOS 7下编译32bit程序的方法

本文记录的方法理论上适用于所有RedHat系Linux发行版!一般在64位Linux下(安装好[kres@localhost test6432]$ ;^编译中断。下面要安装sudo yum install glibc-devel.i686执行后安装了如下文件:======================================================================...

weixin_39949386的博客 305

linux64下编译32位程序,报错

linux64下编译32位程序 gcc -o xxx -m32 xxx.c 遇到问题 /usr/include/gnu/stubs.h:7:27: 致命错误:gnu/stubs-32.h:没有那个文件或目录 安装glibc-devel.i686、libstdc++-devel.i686 yum install glibc-devel.i686 libstdc++-devel.i686 还有可能的问题 /usr/bin/ld: skipping incompatible /usr/.

1337

DeepSeek辅助在64位Linux中编译运行32位的asm-xml-1.4程序

在64位Linux系统上编译32位程序遇到i386架构不兼容问题。尝试下载预编译的32位.o文件或使用fasm汇编均失败。解决方案是安装32位库和工具链:1)启用多架构支持(sudo dpkg --add-architecture i386); 2)安装基础32位库(sudo apt install libc6:i386 gcc-multilib); 3)编译时添加-m32参数(gcc -m32)。若gcc不支持-m32选项,需先安装gcc-multilib包。对于基于RHEL的系统,使用yum/dnf安装

l1t的专栏 1297

64位Linux系统编译32位汇编程序

64位Linux系统编译32位汇编程序的时候需要仿真32位系统的需求,发现使用-m32参数后,编译提示错误,如下: /usr/bin/ld: 未知的仿真模式: 32 支持的仿真: elf_x86_64 elf32_x86_64 elf_i386 i386linux elf_l1om elf_k1om i386pep i386pe collect2: error: ld returned 1

Stephan14的专栏 2987

如何在64位Linux系统上编译32位程序

在64位的ubuntu,GCC8.2.0系统上,如何编译一个32的程序? 查找GCC文档可知,编译64位程序使用-m64选项,例如: gcc -m64 -O3 index.c -o index 编译32位程序使用-m32选项,例如: gcc -m32 -O3 index.c -o index 但是如果编译32位系统报如下错误: /usr/bin/ld: skipping incompatibl...

zhugl的博客 6253

Linux64位操作系统安装编译32位程序

5.安装完成后使用对应的gcc,g++命令编译一个可执行程序,验证是否安装成功。:添加新的架构后,需要更新包索引,以确保新的架构被正确识别。以便能够安装或运行一些仅在 32 位架构上可用的软件包。命令,可以查看是否是32位程序。4.安装32位gcc和g++file + 可执行程序。

m0_47196831的博客 459

golang 编译linux32,golang 64位linux环境下编译出32位程序操作

目标:在64位linux系统上编译出32位程序。操作:1.执行 go env 查看当前go环境配置2.执行 export GOARCH=386 配置go输出系统平台为32位3.go build 编译程序4.使用file main 指令查看编译出的可执行程序是否为32位实践图片:补充:golang float32/64与[]byte互转网络协议开发中经常需要将int、float、bool等转为二进制...

weixin_35653679的博客 1016

linux64位系统编译32位程序的问题

今天将原来一个64位的程序改编译成32位程序,而我的linux系统是64位的,编译时报错了 Error::/usr/include/features.h:324:26: fatal error: bits/predefs.h: No such file or directory 解决办法: sudo apt-get install gcc-multilib 附上链接: https://...

goodstudy168的专栏 487
上一篇: extern 的使用
下一篇: PCI热插拔
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值