web-dev-qa-db-ja.com

64ビットUbuntuで32ビットアプリをコンパイルする方法

Gcc 4.8を使用して、Ubuntu Server 12.04 LTS 64-bitで32ビットCアプリケーションをコンパイルしようとしています。互換性のないライブラリとskipping -lgccに関するリンカエラーメッセージが表示されます。 32ビットアプリをコンパイルしてリンクするにはどうすればよいですか?

38
BSalita

Ubuntu Server 12.04 LTS 64ビットを取得してgcc 4.8 32ビットプログラムをコンパイルするには、2つのことを行う必要があります。

  1. すべての32ビットgcc 4.8開発ツールが完全にインストールされていることを確認してください。

    Sudo apt-get install lib32gcc-4.8-dev

  2. -m32フラグを使用してプログラムをコンパイルします

    gcc pgm.c -m32 -o pgm

15
BSalita

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-multilibgccとは異なる方法でコンパイルされますか?

マルチアーチインストールは、インストールするパッケージ名にアーキテクチャ情報を追加することでサポートされます(これらのパッケージは、使用可能な場合と使用できない場合がある代替名を使用してインストールする代わりに)。

(最新の)マルチアーチインストールの詳細については、 この回答 を参照してください。

あなたの場合、32ビットのgccとlibcをインストールする方が良いでしょう:

Sudo apt-get install libc6-dev:i386 gcc:i386

32ビットlibc開発およびgccパッケージ、およびすべての依存パッケージ(すべて32ビットバージョン)を、64ビットインストールの隣に、破損することなくインストールします。

9
Veger