如何在64位Ubuntu上编译32位应用程序?

BSa*_*ita 40 ubuntu 64-bit 32-bit

我正在尝试使用gcc 4.8在Ubuntu Server 12.04 LTS 64位上编译32位C应用程序.我收到有关不兼容库和的链接器错误消息skipping -lgcc.如何编译和链接32位应用程序需要做什么?

Cir*_*四事件 66

Ubuntu 16.04

sudo apt-get install gcc-multilib
Run Code Online (Sandbox Code Playgroud)

出于某种原因,在Ubuntu 17.04上,我还需要安装特定版本的一个:

sudo apt-get install gcc-6-multilib
Run Code Online (Sandbox Code Playgroud)

然后是一个最小的hello世界:

main.c中

#include <stdio.h>

int main(void) {
    puts("hello world");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译时没有警告:

gcc -m32 -ggdb3 -O0 -pedantic-errors -std=c89 \
  -Wall -Wextra -pedantic -o main.out main.c
Run Code Online (Sandbox Code Playgroud)

./main.out
Run Code Online (Sandbox Code Playgroud)

输出:

hello world
Run Code Online (Sandbox Code Playgroud)

和:

file main.out
Run Code Online (Sandbox Code Playgroud)

说:

main.out: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=87c87a83878ce7e7d23b6236e4286bf1daf59033, not stripped
Run Code Online (Sandbox Code Playgroud)

和:

qemu-i386 main.out
Run Code Online (Sandbox Code Playgroud)

还给出:

hello world
Run Code Online (Sandbox Code Playgroud)

但在x86_64可执行文件上失败:

./main.out: Invalid ELF image for this architecture
Run Code Online (Sandbox Code Playgroud)

此外,我有:

所以我觉得它有效:-)

另请参阅:无法找到crtn.o,在64位系统上链接32位代码

令人遗憾的是,这个软件包与交叉编译器冲突,如gcc-arm-linux-gnueabihf https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211

运行版本的问题:

我们可以直接在64位Ubuntu上运行32位程序,因为Ubuntu内核配置有:

CONFIG_IA32_EMULATION=y
Run Code Online (Sandbox Code Playgroud)

根据:

grep CONFIG_IA32_EMULATION "/boot/config-$(uname -r)"
Run Code Online (Sandbox Code Playgroud)

内核源代码树的帮助如下:

Include code to run legacy 32-bit programs under a
64-bit kernel. You should likely turn this on, unless you're
100% sure that you don't have any 32-bit programs left.
Run Code Online (Sandbox Code Playgroud)

这又是可能的,因为x86 64位CPU具有运行Linux内核使用的32位程序的模式.

TODO:哪些选项的gcc-multilib编译方式不同于gcc

  • (加一)用于痴迷验证结果. (4认同)

BSa*_*ita 16

要使Ubuntu Server 12.04 LTS 64位编译gcc 4.8 32位程序,您需要做两件事.

  1. 确保完全安装了所有32位gcc 4.8开发工具:

    sudo apt-get install lib32gcc-4.8-dev

  2. 使用-m32标志编译程序

    gcc pgm.c -m32 -o pgm


Veg*_*ger 9

通过将体系结构信息添加到要安装的软件包名称来支持多软件安装(而不是使用替代名称来安装这些软件包,这些名称可能有也可能不可用).

有关(现代)多帐户安装的更多信息,请参阅此答案.

在你的情况下,你最好安装32位gcc和libc:

sudo apt-get install libc6-dev:i386 gcc:i386
Run Code Online (Sandbox Code Playgroud)

它将在您的64位安装旁边安装32位libc开发和gcc软件包以及所有依赖软件包(所有32位版本),而不会破坏它.