有人可以解释这三种架构之间的区别吗?实际上当我在Linux中构建一个64位应用程序时,我收到一个链接错误说:
skipping incompatible library.a when searching for library.a
Run Code Online (Sandbox Code Playgroud)
然后我objdump -f在那个库上使用了以下输出:
a.o: file format elf32-x86-64
architecture: i386:x64-32, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000
Run Code Online (Sandbox Code Playgroud)
这是否意味着该库是32位?这是我收到链接器错误的原因吗?
我的程序中有一个错误,因此它在 32 位上工作正常,但在 64 位上只能随机工作,因为程序中某处有 32 位指针截断。
\n\n原因是,如果 malloc 返回一个内存地址,并且在指针分配时在高 32 位中设置了一个位,则指针将变为 NULL。
\n\n所以我找到了触发段错误的指针。但它\xe2\x80\x99s不是我参与的程序(我\xe2\x80\x99m是用户而不是开发人员)并且\xe2\x80\x99s根本没有编译器警告。
\n\n因此,如何确保 malloc 返回一个可以在 32 位模式下使用的值,而不是花费我没有\xc2\xb4t 的时间?
\nX32是使用 32 位指针的amd64/ CPU的 ABI 。x86_64这个想法是将 x86_64 的较大寄存器集与 32 位指针产生的较小内存和缓存占用空间结合起来。它可提供高达约 40% 的加速。有关详细信息以及将其设置为 chroot 环境,请参阅Stack Overflow 上的x86、x32 和 x64 架构之间的差异以及 Debian X32 Ports wiki 页面。
我们收到了 Debian 维护者在该环境下的错误报告。该报告adcq是非法指令。内联汇编是根据预处理器宏激活的,因此我们没有正确检测到 X32(或者更正确地说,到目前为止根本没有检测到)。
对于预处理器宏来说,最明显的选择(对我来说)是类似的__X32__,但没有提供。根据Clang的补丁和Debian的建议,看起来__ILP32__可以使用。但我想要一个更规范的答案,_ILP32而且__code_model_small__看起来也很有趣。(我知道 SSE2 存在问题,编译器支持它,但操作系统不支持)。
使用 Clang 和 GCC 时,可以使用哪些预处理器宏来可靠地检测 X32 ABI 和环境?
需要明确的是,我此时并不想修复代码。我只是想知道可以用于完整修复的宏。
# cpp -dM < /dev/null | sort
#define __amd64 1
#define __amd64__ 1
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_ACQUIRE 2 …Run Code Online (Sandbox Code Playgroud) 这个问题是关于 32 位与 64 位 x86 的术语。
如果我有 2 个包含相同程序源代码的目录 - 一个用于 32 位 Windows,另一个用于 64 位 Windows,那么这些文件夹的更正确名称是什么:
我已经阅读了一些网络资源,但无法理解。仅作记录:
X32允许用户使用在x86_64处理器上运行的32位整数,长整数和指针来编写程序.在某些使用案例中,使用X32有许多好处.(X32与X86或X64 不同 ; 有关详细信息,请参阅x86,x32和x64体系结构之间的差异).
一些Windows Enterprise Server似乎支持X32,但我无法找到更多信息.这是基于一些英特尔PDF,如基于英特尔®至强®处理器E5-2400系列的智能系统平台:
微软关于预定义宏的文档列出了常见的嫌疑,比如_M_X64和_M_AMD64.但它似乎没有讨论X32的架构选项.
如果Microsoft支持X32,那么我怀疑它将是一个类似于大地址空间感知或终端服务感知的选项.
Microsoft 实际上是否支持X32(而不是X86和X64)?
如果是这样,我如何确定何时在Windows下选择X32?
如果没有,那么为什么英特尔专门为Windows推出X32平台呢?