首页
学习
活动
专区
工具
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位的应用程序上运行。这是为什么呢。...原因是在x64的Windows操作系统上,模拟了x86操作系统的操作,并且引入了一个WOW64子系统,将x86和x64完美进行兼容。 WOW64子系统 x86能在x64上运行全靠这个东西。...这个系统由Wow64.dll,Wow64Win.dll,Wow64Cpu.dll三个dll实现,具体怎么实现的不用考虑。 Wow64子系统可以完美实现x86和x64之间的转换。...x64的编译、安装、运行 编译很简单,vs换成x64就行了。...,用x64编译就不行,而x86没问题: 也就是说不运行直接内联汇编了,只能用汇编asm写好了,然后作为函数的形式放进去了。

86940
  • 深入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

    Windows 下使用 ffmpeg 库

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

    3.2K50

    驱动开发:配置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

    Visual Studio 64位应用程序编译

    Visual Studio的编译选项 build下的platform有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需要调用一个32的COM库,只要用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

    1.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。在某些情况下,应用只需要框架的一小部分才能运行,并且可能通过仅包含已使用的库而缩小。

    98010

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

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

    1.9K60

    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.2K20

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

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

    7.6K51

    计算机基础(5)——编程语言与跨平台

    CPU常见的架构有:arm架构,x86架构,mips架构等,汇编语言是针对某一个CPU而写的,不能编译到另一个CPU。例如: add eax,ebx就只是X86 汇编的。...如果需要将该hello程序运行在arm架构的CPU上,我们只需要安装arm架构的编译器,将该hello程序的源代码编译成符合arm架构的汇编指令,最终再由汇编器编译成arm架构的机器指令即可。...实际上,C语言编写的源代码程序想要在windows平台运行还要考虑到操作系统的因素,那么完整的说法应该是需要安装windows平台基于x86架构的编译器,才能在使用了x86架构的CPU并安装了windows...x86架构是由Intel和AMD两家公司主导的个人电脑和服务器市场的架构,而ARM架构则主要用于移动设备如智能手机和平板电脑。...所以官方在推出编译器时也会考虑目前操作系统的市场环境,例如很多语言的编译器/解析器/运行平台等在Linux平台会推出x64架构以及arm架构,但是在windows平台就只会推出x64架构的编译器,这主要还是市场环境决定的

    9531

    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平台上,是解决兼容性问题的必要过渡方案。

    5K40

    设置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 文件夹。 至此,编译过程结束。

    97630

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

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

    2.4K21

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

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

    1.6K40

    OpenCV 图像拼接 优化

    好在opencv2.4.9 有可执行程序,直接安装 opencv2.4.9 即可安装 他的源码,这个比较好,一下子全部搞定。...4.2 OpenCV工程生成: 在选择 Visual Studio 编译版本的时候需要注意下,Opencv 有区分 X86,X64 和 IA及RAM的编译,这个需要根据自己的情况进行选择...,源码目录下不存在cmaketext.txt 文件,不能在windows下直接编译。...Mosaic 相关配置的修改 接下来就是Mosaic工程的整合,无非是 头文件的导入,Lib对应库目录的导入,在Lib库目下发现 ***.lib中有些库和 原来工程的lib库不匹配,无奈只能注释掉...在Release目录下 复制opencv的动态依赖库,lapack动态依赖库,blas依赖库,cholmod只生成了静态库,所以不需要复制,直接运行,程序成功执行。 2.

    11710
    领券