有人可以解释这三种架构之间的区别吗?实际上当我在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位?这是我收到链接器错误的原因吗?
在标准的Intel兼容机器(非Itanium)上有3种常见的ABI可用.
i[3-6]86-linux-gnu.寄存器和指针都是32位.x86_64-linux-gnu.寄存器和指针都是64位.x86_64-linux-gnux32.寄存器是64位,但指针只有32位,在指针繁重的工作流程中节省了大量内存.它还确保所有其他64位处理器功能都可用.上面的每一个都有它的系统调用接口,拥有ld.so自己的完整的库集等等.但是可以在同一个内核上运行所有3个.
在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
Run Code Online (Sandbox Code Playgroud)
现在,如果您收到有关"跳过不兼容的库"的消息,这意味着某些内容与您的配置混乱.确保环境中没有错误的变量或在命令行上传递,或者在包管理器控件之外安装的文件.