i386:x64-32与i386与i386:x86_64之间的区别

8
有人能解释一下这三种架构的区别吗?实际上,当我在Linux中构建64位应用程序时,我遇到了链接错误:

skipping incompatible library.a when searching for library.a

然后我对该库使用 objdump -f 命令,得到以下输出:

a.o: file format elf32-x86-64
architecture: i386:x64-32, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

这是否意味着该库是32位的?这是我收到链接器错误的原因吗?

请注意,静态库通常会带来比它们所值得的更多的麻烦。如果您确实需要使用动态库,请使用${ORIGIN}相对路径的-rpath,并且不需要setuid或任何其他capabilities - o11c
这个回答解决了你的问题吗?x86、x32和x64架构之间有什么区别? - phuclv
2个回答

11

在标准Intel兼容机器上(不包括Itanium),通常有三种常见的ABI可用:

  • 经典的32位架构,通常简称为“x86”,其中三元组为i[3-6]86-linux-gnu。寄存器和指针都是32位。
  • 最初来自AMD的64位扩展,通常简称为“amd64”,其GNU三元组为x86_64-linux-gnu。寄存器和指针都是64位。
  • 新的“x32”ABI,三元组为x86_64-linux-gnux32。寄存器是64位,但指针仅为32位,在指针密集型工作流程中节省了大量内存。它还确保所有其他仅支持64位处理器功能都可用。

以上每个ABI都有自己的系统调用接口、独立的ld.so、完整的库集等。但可以在同一内核上运行所有三个ABI。

在Linux上,它们的加载程序如下:

% objdump -f /lib/ld-linux.so.2 /lib64/ld-linux-x86-64.so.2 /libx32/ld-linux-x32.so.2

/lib/ld-linux.so.2:     file format elf32-i386
architecture: i386, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x00000a90


/lib64/ld-linux-x86-64.so.2:     file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0000000000000c90


/libx32/ld-linux-x32.so.2:     file format elf32-x86-64
architecture: i386:x64-32, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x00000960

如果你收到“跳过不兼容库”的消息,那意味着你的配置出了问题。确保环境中没有错误的变量或者在命令行上传递,也没有安装超出包管理器控制范围之外的文件。


@SanthoshKumar,很可能您没有安装x32 devenv(没有libgcc,没有glibc等)。尝试安装x32并编译一些简单的东西gcc -mx32 helloworld.c - Severin Pappadeux
实际上这是由其他人提供的库。为了构建我的应用程序,我需要链接该库。在我的电脑上,我可以看到 /lib 和 /lib64,但没有 /libx32。 - Santhosh Kumar
@SanthoshKumar 你使用的是哪个Linux系统? - Severin Pappadeux
@Severin:我正在使用OpenSuSe 13.1。 - Santhosh Kumar
@SanthoshKumar 真遗憾,我是Ubuntu用户。请检查更新。 - Severin Pappadeux
显示剩余2条评论

3
除了通常的完整64位和老旧的32位ABI,还有一种特殊的ABI(受SGI n32环境启发),其中指针是32位(因此它们是32位应用程序),但是它被设计为在64位主机上运行并具有对所有x64好处的完全访问权限:

  • 本地x64寄存器和数学
  • 更多寄存器
  • SSE2 / 3/4,AVX1 / 2 / ...
  • 在64位主机上拥有完整的4Gb地址空间

它被称为x32 ABI,链接:https://en.wikipedia.org/wiki/X32_ABI

更新

在Ubuntu系统上,我需要安装两个软件包(带有依赖项)才能使x32工作:

 > sudo apt install gcc-multilib
 > sudo apt install libx32stdc++-5-dev 

使用g++ -mx32 hellow.cpp编译简单的C++代码可以成功,生成x32可执行文件。

> file a.out
./a.out: ELF 32-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /libx32/ld-linux-x32.so.2, for GNU/Linux 3.4.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接