我正在尝试使用gcc 4.8在Ubuntu Server 12.04 LTS 64位上编译一个32位的C应用程序。我收到关于不兼容库以及跳过-lgcc的链接器错误信息。我需要做什么才能编译和链接32位应用程序?
sudo apt install gcc-multilib g++-multilib
然后是一个最小的hello world:
main.c
#include <stdio.h>
int main(void) {
puts("hello world");
return 0;
}
使用以下编译器可以无警告地编译:
gcc -m32 -ggdb3 -O0 -pedantic-errors -std=c89 \
-Wall -Wextra -pedantic -o main.out main.c
和
./main.out
hello world
并且:
file main.out
说:
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
并且:
qemu-i386 main.out
也会给出:
hello world
但在一个 x86_64
可执行文件上失败了:
./main.out: Invalid ELF image for this architecture
gcc-arm-linux-gnueabihf
)存在冲突https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211
问题的版本信息:
CONFIG_IA32_EMULATION=y
grep CONFIG_IA32_EMULATION "/boot/config-$(uname -r)"
在内核源代码树上提供帮助的人阅读:
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.
g++-multilib
软件包。 - E. Vakililib32gcc-10-dev
(值得注意的是,在我的情况下,版本10来自PPA;如果没有PPA,则会是较低的版本)。 - Hi-Angel为了让Ubuntu Server 12.04 LTS 64位编译gcc 4.8 32位程序,你需要做两件事。
确保所有32位gcc 4.8开发工具都被完全安装:
sudo apt-get install lib32gcc-4.8-dev
使用-m32标志编译程序
gcc pgm.c -m32 -o pgm
-m32
标志仅适用于 32 位 x86。您需要不同的标志来编译 32 位 ARM、RISC-V 等架构的代码。 - Aaron Franke通过将体系结构信息添加到要安装的软件包名称中来支持Multiarch安装(而不是使用可能可用或可能不可用的替代名称安装这些软件包)。
有关(现代)Multiarch安装的更多信息,请参见此答案。
在您的情况下,最好安装32位gcc和libc:
sudo apt-get install libc6-dev:i386 gcc:i386
它将安装32位libc开发和gcc软件包,以及所有依赖软件包(所有32位版本),而不会破坏您的64位安装。