【问题标题】:difference between i386:x64-32 vs i386 vs i386:x86_64i386:x64-32 vs i386 vs i386:x86_64 之间的区别
【发布时间】:2016-07-20 17:07:09
【问题描述】:

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

【问题讨论】:

  • 请注意,静态库通常比它们的价值要麻烦得多。如果您真的需要和不需要setuid 或任何其他capabilities,请使用动态库和${ORIGIN}-relative -rpath

标签: linux x86 x86-64


【解决方案1】:

除了通常的完整 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 编译简单的 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

【讨论】:

    【解决方案2】:

    有 3 种常见的 ABI 可用于标准 Intel 兼容机器(不是 Itanium)。

    • 经典的 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 位处理器功能都可用。

    上面的每一个都有自己的系统调用接口,自己的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
    

    现在,如果您收到有关“跳过不兼容的库”的消息,这意味着您的配置有问题。确保环境中没有错误的变量或在命令行中传递,或安装在包管理器控制之外的文件。

    【讨论】:

    • 感谢您提供的信息。在我的 Linux PC 中,我根本找不到 /lib/libx32。这可能是造成这种情况的原因吗?
    • 这并不奇怪,如果您没有安装支持 multilib 的 gcc 基础包,您可能不会引入 glibc 位。当然,在那种情况下,我不确定您是如何获得图书馆的 all ...
    • @SanthoshKumar 可能您没有安装 x32 devenv(没有 libgcc,没有 glibc,...)。尝试安装 x32 并编译一些简单的东西gcc -mx32 helloworld.c
    • 其实是别人提供的库。要构建我的应用程序,我需要与库链接。在我的电脑中,我可以看到 /lib 和 /lib64,但看不到 /libx32。
    • @SanthoshKumar 你有什么 linux 系统?
    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 2015-08-09
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2013-02-05
    相关资源
    最近更新 更多