Gcc 4.8を使用して、Ubuntu Server 12.04 LTS 64-bitで32ビットCアプリケーションをコンパイルしようとしています。互換性のないライブラリとskipping -lgcc
に関するリンカエラーメッセージが表示されます。 32ビットアプリをコンパイルしてリンクするにはどうすればよいですか?
Ubuntu Server 12.04 LTS 64ビットを取得してgcc 4.8 32ビットプログラムをコンパイルするには、2つのことを行う必要があります。
すべての32ビットgcc 4.8開発ツールが完全にインストールされていることを確認してください。
Sudo apt-get install lib32gcc-4.8-dev
-m32フラグを使用してプログラムをコンパイルします
gcc pgm.c -m32 -o pgm
Ubuntu 16.04
Sudo apt-get install gcc-multilib
何らかの理由で、Ubuntu 17.04では、バージョン固有のものもインストールする必要がありました。
Sudo apt-get install gcc-6-multilib
次に、最小限のこんにちは世界:
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
さらに、私は持っています:
だから私はそれがうまくいくと思う:-)
参照: crtn.oが見つかりません。64ビットシステムで32ビットコードをリンクしています
このパッケージがgcc-arm-linux-gnueabihf
などのクロスコンパイラと競合するのは残念です https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1300211
質問の実行中のバージョン:
Ubuntuカーネルは以下で構成されているため、64ビットUbuntuで32ビットプログラムを直接実行できます。
CONFIG_IA32_EMULATION=y
による:
grep CONFIG_IA32_EMULATION "/boot/config-$(uname -r)"
kernel source tree のヘルプは次のとおりです。
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.
X86 64ビットCPUには、Linuxカーネルが使用する32ビットプログラムを実行するモードがあるため、これは可能です。
TODO:gcc-multilib
はgcc
とは異なる方法でコンパイルされますか?
マルチアーチインストールは、インストールするパッケージ名にアーキテクチャ情報を追加することでサポートされます(これらのパッケージは、使用可能な場合と使用できない場合がある代替名を使用してインストールする代わりに)。
(最新の)マルチアーチインストールの詳細については、 この回答 を参照してください。
あなたの場合、32ビットのgccとlibcをインストールする方が良いでしょう:
Sudo apt-get install libc6-dev:i386 gcc:i386
32ビットlibc開発およびgccパッケージ、およびすべての依存パッケージ(すべて32ビットバージョン)を、64ビットインストールの隣に、破損することなくインストールします。