ld: i386 架构于输入文件foo.o 与 i386:x86-64 输出不兼容

报错:ld: i386 架构于输入文件 foo.o 与 i386:x86-64 输出不兼容

或者:ld: i386 architecture of input file `foo.o‘ is incompatible with i386:x86-64 output

编译链接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -c bar.c -o bar.o
3 ld -s -o foobar bar.o foo.o
汇编语言用nasm编写并用nasm编译器编译,而C语言用的是gcc编译,这些都没有问题,但是在链接的时候出错了,提示如下:
ld: i386 architecture of input file `foo.o‘ is incompatible with i386:x86-64 output

意思就是nasm 编译产生的是32位的目标代码,gcc 在64位平台上默认产生的是64位的目标代码,这两者在链接的时候出错,gcc在64位平台上默认以64位的方式链接。
这样在解决的时候就会有两种解决方案:
<1> 让gcc 产生32位的代码,并在链接的时候以32位的方式进行链接
在这种情况下只需要修改编译和链接指令即可,具体如下:
32位的编译链接指令
1 nasm -f elf foo.s -o foo.o
2 gcc -m32 -c bar.c -o bar.o
3 ld -m elf_i386 -s -o foobar foo.o bar.o
具体的-m32 和 -m elf_i386 请自行查阅gcc (man gcc)

如果你是高版本的gcc(可能是由于更新内核造成的),可能简单的使用-m32 的时候会提示以下错误(使用别人的历程,自己未曾遇到):
> In file included from /usr/include/stdio.h:28:0,
> from test.c:1:
> /usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
> compilation terminated.
这应该是缺少构建32 位可执行程序缺少的包,使用以下指令安装:
sudo apt-get install libc6-dev-i386
此时应该就没有什么问题了。

参考:https://zhidao.baidu.com/question/1831399869227285020.html

时间: 2024-08-09 10:44:36

ld: i386 架构于输入文件foo.o 与 i386:x86-64 输出不兼容的相关文章

Ubuntu 16.04使用NASM编译时用ld链接程序出现:i386 架构于输入文件 sandbox.o 与 i386:x86-64 输出不兼容(I386 architecture in the input file sandbox.o is not compatible with i386: x86-64 output)

错误: 问题解决过程: 1.先确定CPU的架构 2.这是以64位架构的CPU,如果使用elf参数时,默认是以32位模式去处理,那么此时需要更精确的去指定这个模式,比如elf32(32位),elf64(64位),具体的参考:http://www.nasm.us/doc/nasmdoc7.html 那么改写上面的写法可以为: nasm -f elf64 -g -F stabs sandbox.asm -o sandbox.o ld -o sandbox sandbox.o 3.如果想编译程32位和6

Linux 小知识翻译 - 「架构 续」(arch)

上次,从「计算机的内部构造」的角度解释了架构这个术语.这次,介绍下架构中经常提到的「i386架构」及之后的「i486」,「i586」. 安装Linux的时候,很多人即使不了解但也会经常听到i386架构这个词.因此,会误认为「自己的PC的架构是i386架构的」.现在用i386的人是非常少的. i386的 i 就是「Intel」的首字母.i386是1985年发布的架构,那么如今还在用i386电脑的人... ...将近20年没有换过电脑了.(这篇文章应该是作者2005年左右写的) 实际上i386的CP

搞事情:linux下安装迅雷和qq。(迅雷接近完美,qq能记住密码,不能视频) 转载

只关心软件下载地址和安装方法的话可以直接下拉到文末"核心内容"处 一.闲聊 我们知道,linux桌面版的普及总是受着很大的制约,其中一个不得不提的原因便是商业软件的缺失,很多我们难以诀别的驱动和商业软件都没有linux原版的(如QQ.迅雷.百度云等),使得我们在使用linux发行版的时候总是遇到诸多的不便.同时,由于linux的开源特性,以linux为核心的发行版可谓是林林总总,仅仅是我所接触的linux发行版便不下20个.不同的linux发行版总是有着不同的特色,但是毫无疑问的是,每

让64位的WSL(windows子linux系统)支持运行32位程序

假设有一个新的Ubuntu WSL实例,则需要安装qemu-user-static软件包,添加i386 binfmt,启用i386体系结构,更新软件包列表,并安装一些i386软件包: 安装qemu和binfmt sudo apt update sudo apt install qemu-user-static sudo update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\

Linux内核抢占机制 - 实现

本文首发于 http://oliveryang.net,转载时请包含原文或者作者网站链接. 本文主要围绕 Linux 内核调度器 Preemption 的相关实现进行讨论.其中涉及的一般操作系统和 x86 处理器和硬件概念,可能也适用于其它操作系统. 1. Scheduler Overview Linux 调度器的实现实际上主要做了两部分事情, 任务上下文切换 在 Preemption Overview 里,我们对任务上下文切换做了简单介绍.可以看到,任务上下文切换有两个层次的实现:公共层和处理

iOS 编译含C++代码出现ld: symbol(s) not found for architecture i386错误之解决(转载)

最近项目需要搭建自己的IM服务器,在快速配置好Openfire之后,开始研究使用gloox开发XMPP客户端实现通信, 先下载gloox源码,然后./configure,make ,sudo make install,在/usr/local/下找到头文件夹和静态库,加到项目中,然后加入openssl库,编写测试代码,编译,报错:XXX not being for architecture i386,感觉是gloox静态库有问题(排除了网上说的头文件路径缺失.building phases没添加.

ld 脚本浅析-LD手册粗糙翻译

本文乃转载, 我在其基础上做了少量修改. 原作者的E-mail是[email protected] 完成于2005.11.5-2005.11.8 0. Contents 1. 概论2. 基本概念3. 脚本格式4. 简单例子5. 简单脚本命令6. 对符号的赋值7. SECTIONS命令8. MEMORY命令9. PHDRS命令10. VERSION命令11. 脚本内的表达式12. 暗含的连接脚本 1. 概论 每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控

cpu有哪些架构

原文:http://blog.csdn.net/wyzxg/article/details/5027738 author:skatetime:2009/12/17 这几天在下载RPM包的时候,总会看见x86,x86-64,IA64,i386,i586等,这些都是cpu的架构,有点记不清了,所以特此记录下,以备日后查询 CPU架构 Architecture ,结构.架构,这个词用于 CPU 的时候是指 CPU “接受和处理信号的方式”,及其内部元件的组织方式.CPU架构,从大的层面分两类——CIS

x86、i386、i486、i586、i686和x86_64

x86.i386.i486.i586.i686和x86_64 1.386与686 i386—几乎所有的X86平台,不论是旧的pentum或者是新的pentum-IV与K7系统CPU,都可以正常工作,i指得是Intel兼容的CPU,至于386就是CPU的等级. i586—就是586等级的计算机,包括pentum第一代MMX CPU,AMD的K5,K6系统CPU(socket7插脚)等CPU都是这个等级. i686—pentum 2 以后的Intel系统CPU及K7以后等级的CPU都属于这个686等