有人可以解释这三种架构之间的区别吗? 实际上当我在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位?这是我收到链接器错误的原因吗?
答案 0 :(得分:8)
在标准的Intel兼容机器(非Itanium)上可以使用3种常见的ABI。
x86_64-linux-gnu
这样的三元组。寄存器和指针都是32位。x86_64-linux-gnux32
的GNU三元组。寄存器和指针都是64位。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好东西:
它被称为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