首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么为x86编译的某些程序不能在x64下运行,而有些则可以

为什么为x86编译的某些程序不能在x64下运行,而有些则可以?

x86和x64是不同的处理器架构,x86是32位处理器架构,而x64是64位处理器架构。由于两者的指令集和寻址方式不同,因此为x86编译的程序不能直接在x64下运行。

主要原因如下:

  1. 指令集不同:x86和x64处理器使用不同的指令集。x86处理器使用IA-32指令集,而x64处理器使用x86-64指令集。这意味着为x86编译的程序使用的指令在x64处理器上可能无法识别或执行。
  2. 寻址方式不同:x86和x64处理器使用不同的寻址方式。x86处理器使用32位地址空间,而x64处理器使用64位地址空间。为x86编译的程序使用的内存地址可能超出x64处理器的寻址范围,导致无法正常访问内存。
  3. 库文件不兼容:x86和x64处理器使用不同的库文件。为x86编译的程序使用的库文件是32位版本的,而x64处理器需要使用64位版本的库文件。如果程序依赖于特定的库文件,而该库文件没有提供x64版本,那么程序将无法在x64下运行。

然而,并非所有为x86编译的程序都无法在x64下运行。一些简单的程序或者没有使用特定的库文件的程序可能可以在x64下正常运行。此外,一些操作系统提供了兼容性层,可以在x64处理器上模拟运行x86程序。

总结起来,为x86编译的某些程序不能在x64下运行是因为指令集和寻址方式的不同,以及库文件的不兼容。在将程序从x86迁移到x64时,需要重新编译为x64版本或者使用兼容性层来实现运行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Windows内核开发-9-32位和64位区别

32位应用程序可以完美再64位电脑上运行32位内核驱动无法再64位电脑上运行,或者64位驱动无法在32位应用程序运行。这是为什么呢。...原因是在x64Windows操作系统上,模拟了x86操作系统操作,并且引入了一个WOW64子系统,将x86x64完美进行兼容。 WOW64子系统 x86能在x64运行全靠这个东西。...这个系统由Wow64.dll,Wow64Win.dll,Wow64Cpu.dll三个dll实现,具体怎么实现不用考虑。 Wow64子系统可以完美实现x86x64之间转换。...x64编译、安装、运行 编译很简单,vs换成x64就行了。...,用x64编译就不行,x86没问题: 也就是说运行直接内联汇编了,只能用汇编asm写好了,然后作为函数形式放进去了。

85640
  • Windows 使用 ffmpeg 库

    最后一种方式最为复杂,但这种方式编译 ffmpeg 是最符合 Windows 风格。 VS中选择 x86x64 当 ffmpeg 库编译好之后,我们该如何使和它呢?...通俗讲,x86编译是32位系统可执行程序x64编译是 64位系统可执行程序。 由于 Windows 是向下兼容,所以你编译x86程序可以跑在 64 位系统上。...相反如果你选择输出是x64的话,它只能跑在64位系统上,在 32 位系统上是无法运行。...但凡事儿有利有弊,如果你编译x86程序,虽然它可以x64位系统上运行,但它运行速度要比编译x64程序运行慢很多。...由于目前大多数系统都是64位了,所以我建议尽可以编译x64 程序。 ? 另外需要注意是,我们在选择 x86x64时,也要注意是否与我们前面编译 ffmpeg 是一致

    3.2K50

    深入iOS系统底层之指令集介绍

    IA-64与x86软件天生兼容;它使用各种模拟形式来运行x86软件,不过,以模拟方式来运行效率十分低下,并且会影响其他程序运行。...AMD公司主动把32位x86(或称为IA-32)扩充64位。...比如32位应用程序能够在64位CPU上执行,小字长CPU指令集则无法直接提供大字长指令集能力,如需要支撑通常都是通过模拟来完成,比如说一个64位字长CPU读取数据指令在32位字长CPU上就可以通过模拟两次读取来完成...,现在有的CPU提供了指令模拟功能,因此某些64位应用程序还是可以运行在32位CPU上,只不过性能和速度会存在很大损耗。...其实现原理是Visual studio2017本身提供了一个OC语言编译器,同时他内部也提供了一个Cocoa UI框架模拟实现版本,所以能在上面运行iOS应用。

    1.1K10

    Visual Studio 64位应用程序编译

    Visual Studio编译选项 buildplatform有X64、Any CPU和x86。...X86表示只能在32位环境运行X64表示只能在64位环境运行,Any CPU表示你程序可以根据环境变化适应32位还是64位,但是如果你程序集依赖于一个x86选项编译程序集,哪么你程序集只能选择...X86进行编译不能选择Any CPU编译,如果使用Any CPU编译运行就会出现如下错误:    Unhandled Exception: System.BadImageFormatException...,那么在64位机器默认运行就是64位,通常这情况十assembly需要调用一个32COM库,只要用x86编译,那么程序就是以32位程序,依靠wow64来运行,就可以在64位系统上运行。...上述问题发生在我准备在Windows Server 2008 R2 Server Core上部署应用程序所碰到问题总结,折腾了将近一天时间,希望对今后碰到类似问题同学有帮助,可以节省更多时间。

    1.1K50

    驱动开发:配置Visual Studio驱动开发环境

    ,接着我们编写一段驱动初始化代码,然后按F7即可完成驱动编译。...\pipe\com_1 -> 该端是服务器,另一端是应用程序 -> 轮询时主动放弃CPU->确定 2.开启虚拟机中Windows系统,然后以管理员身份运行CMD命令行,输入bcdedit命令,可以查看到系统的当前启动项...3.最后查看一当前调试配置选项,执行命令 bcdedit /dbgsettings,显示出使用第一个串口,波特率115200bps,保持默认不需要修改。...,并在WinDBG中输入g命令让系统运行起来,将编译驱动程序拖入到虚拟机中,并以管理员身份打开Windows 64Signer.exe,使用该工具对驱动程序进行签名,如下图所示; 签名完成后将我们驱动文件...,如果不使用WinDBG工具想要获取到DbgPrint()函数输出结果,可以使用课件中提供dbgview64.exe程序,不过此程序需要注意几点,该程序需要使用管理员身份运行,且运行后需要将Capture

    1K20

    译 | .NET Core 3.0 Preview 6 已发布

    R2R 程序集包含 IL 和本机代码。它们特定最小化 .NET Core 运行时版本和运行时环境 (RID) 编译。...例如 .NET Standard 2.0 程序集可能是 .NET Core 3.0 和 Linux x64 编译 R2R。...注意: 编译应用程序程序集时,生成本机代码特定于平台和体系结构(这就是为什么在发布时必须指定有效运行时标识符)。...例外情况: Windows x64 可用于编译 Windows ARM32、ARM64 和 x86 镜像。 Windows x86 可用于编译 Windows ARM32 镜像。...使用 .NET Core,始终可以发布包含运行代码所需一切自包含应用,而无需在部署目标上安装 .NET。在某些情况,应用只需要框架一小部分才能运行,并且可能通过仅包含已使用缩小。

    97310

    驱动开发:配置Visual Studio驱动开发环境

    ,接着我们编写一段驱动初始化代码,然后按F7即可完成驱动编译。...\pipe\com_1 -> 该端是服务器,另一端是应用程序 -> 轮询时主动放弃CPU->确定 图片 2.开启虚拟机中Windows系统,然后以管理员身份运行CMD命令行,输入bcdedit命令,可以查看到系统的当前启动项...图片 3.最后查看一当前调试配置选项,执行命令 bcdedit /dbgsettings,显示出使用第一个串口,波特率115200bps,保持默认不需要修改。...,并在WinDBG中输入g命令让系统运行起来,将编译驱动程序拖入到虚拟机中,并以管理员身份打开Windows 64Signer.exe,使用该工具对驱动程序进行签名,如下图所示; 图片 签名完成后将我们驱动文件...,如果不使用WinDBG工具想要获取到DbgPrint()函数输出结果,可以使用课件中提供dbgview64.exe程序,不过此程序需要注意几点,该程序需要使用管理员身份运行,且运行后需要将Capture

    1.6K50

    IA64与x86-64区别

    因为微软缘故,32位系统在过去很长一段时间内,占据着桌面计算机主流地位。64位系统能够在较新x86-64架构CPU上运行ia-64只能运行于INTEL安腾系列处理器。...虽然x86-64和IA-64处理器都能够运行64位操作系统和应用程序,但是区别在于: x86-64架构基于x86,是为了让x86架构CPU兼容64位计算产生技术。...X86-64架构设计是采用直接简单方法将目前x86指令集扩展。这个方法与当初由16位扩展至32位情形很相似。优点在于用户可以自行选择x86平台或x64平台,兼容性高。...IA-64是原生纯64位计算处理器,并且与x86指令兼容。如果想要执行x86指令需要硬件虚拟化支持,而且效率不高。优点在于IA-64架构体系将拥有64位内存寻址能力,能够支持更大内存寻址空间。...而且,这些IA-64架构处理器也不能够使用x64操作系统。x86-64处理器则可以自由选择x86或是x64操作系统。

    1.1K20

    【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践

    flagsO_CLOEXEC强制置位新文件描述符 close-on-exec 标志 事实上,三个方法除了功能上差异外,在平台适配上也有些不同: Darwin(MacOS)X86架构支持: Dup2...下面是一个具体例子,假设我们需要编译一个使用了libcurl库Go程序,并且需要在Linux和Windows操作系统中分别编译x86x64架构程序。...Linux和Windows操作系统中x86x64架构程序 2.2 使用交叉编译工具 使用交叉编译工具。...在进行CGO编译时,我们可以使用交叉编译工具来编译出多个不同操作系统和架构程序,从而确保我们程序可以在不同操作系统和架构中正常运行。...下面是一个详细cgo交叉编译例子,假设我们需要编译一个使用了libcurl库Go程序,并且需要在Linux和Windows操作系统中分别编译x86x64架构程序

    1.5K60

    【保姆级教程】Docker服务在双架构(X86和ARM)编译统一实践

    下面是一个具体例子,假设我们需要编译一个使用了libcurl库Go程序,并且需要在Linux和Windows操作系统中分别编译x86x64架构程序。...Linux和Windows操作系统中x86x64架构程序2.2 使用交叉编译工具使用交叉编译工具。...在进行CGO编译时,我们可以使用交叉编译工具来编译出多个不同操作系统和架构程序,从而确保我们程序可以在不同操作系统和架构中正常运行。...下面是一个详细cgo交叉编译例子,假设我们需要编译一个使用了libcurl库Go程序,并且需要在Linux和Windows操作系统中分别编译x86x64架构程序。...编译Windows x64架构程序最后,我们需要编译Windows x64架构程序

    6.8K51

    设置cl.exe 环境变量(vs2017)【转】

    之后打开命令行,输入cl,如果出现下图,配置成功…… 实际路径根据自己安装路径有所不同。...\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx86\x86 添加链接描述 要编译 Boost 版本:1.54.0。...\bootstrap.bat 如果之前没有设置 cl 命令环境变量,这里将会报如下错误: ‘cl’ 不是内部或外部命令,也不是可运行程序。...然后再次运行 .\bootstrap.bat ,正常情况应该输出以下信息: 然后接下来要运行 .\b2 命令来进行编译编译命令如下: ....\b2 命令,如果没有什么什么问题应该就可以正常编译了。 编译之后,会生成一个 include 文件夹和一个 lib 文件夹。 至此,编译过程结束。

    83030

    一口气看完45个寄存器,CPU核心技术大揭秘

    可无论什么样应用程序,什么样编程语言,最终程序逻辑都是要交付给CPU去执行实现(当然这里有些不严谨,除了CPU,还有协处理器、GPU等等)。...在x64架构,原来eflags寄存器升级64位rflags,不过其高32位并没有新增什么功能,保留将来使用。...而在漏洞攻击中,黑客想尽办法费尽心机都想要修改指令寄存器地址,从而能够执行恶意代码。 同样,在x64架构,32位eip升级64位rip寄存器。...程序能够被调试,关键在于能够被中断执行和恢复执行,被中断地方就是我们设置断点。那程序是如何能在遇到断点时候停下来呢? ?...对于通常断点,也就是程序执行到某个位置就停下来,这种断点实现方式,在x86/x64上,是利用了一条软中断指令:int 3来进行实现

    2.3K21

    基于.net core实现项目自动编译、并生成nuget包

    一、遇到问题,以及解决办法 1.1 不同平台编译怎么办       .net可以将dll(或者说是项目)编译x86x64、anycpu 等至少三种平台代码。...可是,如果你一个解决方法中即有x86项目、又有anycpu项目可怎么是好呢。解决办法:创建两个sln文件,一个用x86平台编译,一个用于anycpu平台编译。 ?...还原相关引用 生成项目,根据提示引用相关类型,默认调整后是 类库 文件,如果需要变成 应用执行程序可以自己修正即可。 ? 生成并运行 在还原好依赖项,以及调整好输出类型后,即可完成 项目的迁移。...且还可以分平台实现。核心参数说明: /p:是设置msbuild相关参数入口,如:包版本(版本在dotnet core上好像此支持三个阶段,如:1.0.0这种,四阶段没有了),以及平台等。...--output:生成包输出文件夹 此命令还有些不足点,如 anycpu和x86中都编译同一个项目,后者编译会覆盖前者(感觉可以用nuget包依赖来解决)。

    1.6K40

    ARM版Win10终于能用上x64程序了,微软发布x64模拟器预览版

    鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 现在,ARM64设备上Windows系统,也可以运行64位x86应用程序x64)了。...这就意味着,使用ARM芯片笔记本用户,以后可以直接安装、运行几乎所有Windows exe应用程序不必再被兼容性问题劝退了。...根据微软官方博客,在这个名为Build 21277预览版本中,用户可以从微软应用商店或其他任何渠道安装x64应用程序,并在ARM芯片上运行它们。...比如光栅图形软件应用程序Autodesk Sketchbook、游戏《火箭联盟》等等。 像Chrome浏览器,此前在ARM64上只能作为32位应用程序运行,现在也可以在64位上运行了。...但在更多开发者去重新编译应用,适配ARM之前,让x86平台成熟软件能通过模拟直接迁移到ARM平台上,是解决兼容性问题必要过渡方案。

    3.8K40

    Cobalt Strike Spawn & Tunnel

    但是拉斯塔,你可能在想。Beacon 已经有外部监听器,shspawn 和 shinject 命令,它们已经可以通过 Beacon 生成 Meterpreter 会话。...为什么我们需要更多命令来完成同样工作? 撇开攻击性深度争论不谈,外部侦听器相当有限,因为它仅支持 32 位并且与无阶段有效负载兼容。...在这种情况,我在 Windows 上运行 CS 客户端,在 Ubuntu 中使用 WSL2 运行 msfconsole。将多处理程序设置侦听0.0.0.0:4444。...如果您在使用 NAT、桥接或内部网络 VM 中运行 Metasploit,您将指定 VM IP 地址不是 127.0.0.1。...您可以推断,这是一种生成反向端口转发通用方法,该端口转发将通过隧道返回到 Cobalt Strike 主机,不是 Team Server。

    1.5K30

    Linux 中 32 位与 64 位

    AMD开发架构称为amd64(将寄存器扩充64位,支持64位虚拟地址),能够完全兼容x86指令集,不用任何修改就能运行操作系统和应用软件,在PC界得到广泛应用,现在市场上几乎所有的PC用途...当然intel也很快开发出支持该指令集CPU,不过intel将其称为x64架构,不是用amd64这个名字。而在linux中称为x86_64,即x86架构64位扩展。...另外在64位系统中,为了兼容数量众多应用程序,系统都会增加一个虚拟层,用来翻译x86指令,这样32位程序可以在64位系统中运行(windows和linux都支持)。...同样在64位系统中,使用64位编绎器一般也可以选择编译成32位程序(gcc使用-m32编译成32位可执行文件)。 另外在PC上,软件能否运行,只需看系统是否支持即可,可以不用理会CPU架构。...在debian amd64光盘中带内核及软件包全都是64位版本debian i386光盘中则有32位和64位内核,以及32位软件,可能是考虑到有些用户想用64位内核来运行32位程序吧。

    3.3K20
    领券