i386:x64-32 vs i386 vs i386:x86_64之间的差异

时间:2016-04-01 02:34:12

标签: linux x86 x86-64

有人可以解释这三种架构之间的区别吗? 实际上当我在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位?这是我收到链接器错误的原因吗?

2 个答案:

答案 0 :(得分:8)

在标准的Intel兼容机器(非Itanium)上可以使用3种常见的ABI。

  • 经典的32位架构,通常称为" x86"简而言之,它有像x86_64-linux-gnu这样的三元组。寄存器和指针都是32位。
  • 最初来自AMD的64位扩展,通常称为" amd64"简而言之,它具有x86_64-linux-gnux32的GNU三元组。寄存器和指针都是64位。
  • 新的" x32" ABI,有ld.so的三倍。寄存器是64位,但指针只有32位,在指针繁重的工作流程中节省了大量内存。它还确保所有其他64位处理器功能都可用。

上面的每一个都有它的系统调用接口,拥有% 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 ,拥有完整的库集等等。但是可以在同一个内核上运行所有3个。

在Linux上,他们的加载器是:

 testtime<-("2013-07-21 02:00:01 PM") 
 library(lubridate) 
 ymd_hms(testtime)
[1] "2013-07-21 14:00:01 UTC"

现在,如果你收到关于&#34;跳过不兼容的库&#34;的消息,这意味着你的配置搞砸了。确保您在环境中没有错误的变量或在命令行上传递,或者在包管理器控件之外安装的文件。

答案 1 :(得分: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系统上,我必须安装两个软件包(使用deps)才能使x32正常工作:

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

然后使用g++ -mx32 hellow.cpp编译simleple 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