2016-04-01 13 views
6

3つのアーキテクチャの違いを説明できる人はいますか?私はLinux上で64ビットアプリケーションを構築したときに 実は、私は言っリンクエラーを得た:i386:x64-32とi386とi386の違い:x86_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ビットですか?それが私がリンカエラーを起こしている理由ですか?

+0

静的ライブラリは一般的には価値があるものよりもはるかに遠い*ということに注意してください。 'setuid'やその他の' capabilities'を必要とせず、必要としない場合は、 '$ {ORIGIN}'と相対的な '-rpath'を使って動的ライブラリを使用してください。 – o11c

答えて

8

を作るg++ -mx32 hellow.cpp作品とのコード、3共通のABI USAがあります。インテル互換の標準的なマシン(Itaniumではなく)で動作します。

  • 「x86」と呼ばれることが多い古典的な32ビットアーキテクチャで、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 

さて、あなたが何かあなたの設定で台無しにされたことを意味「互換性のないライブラリをスキップ」についてのメッセージを、取得している場合。環境に悪い変数がないか、コマンドラインで渡されたか、パッケージマネージャのコントロールの外にインストールされたファイルであることを確認してください。

+0

私のLinux PCの情報をありがとう。私は/ lib/libx32を見つけることができませんでした。これはこれの原因になりますか? –

+0

これは驚くことではありませんが、マルチブロック対応のgccベースパッケージがインストールされていないと、おそらくglibcビットを取得していないことになります。もちろん、その場合は、ライブラリがどのように*すべて*になっているか分かりません。 – o11c

+0

@SanthoshKumarはx32 devenvがインストールされていない可能性があります(libgcc、glibc、...はありません)。 x32をインストールして、単純な 'gcc -mx32 helloworld.c'をコンパイルしてみてください。 –

3

通常の64ビットと古い32ビットABI以外にも、ポインタは32ビット(つまり32ビットのアプリケーション)の特別なABI(SGI n32環境に触発されています)がありますが、64ビットホスト上で動作し、

  • ネイティブのx64レジスタと数学
  • 以上のレジスタ64ビットホスト上の
  • SSE2/3月4日、AVX1/2/...
  • 全4GBのアドレス空間
:すべてのx64グッズへ私はX32の作業を取得する(DEPSで)二つのパッケージをインストールする必要がUbuntuのシステムで https://en.wikipedia.org/wiki/X32_ABI

UPDATE

:それはx32のABI、リンクと呼ばれている

> sudo apt install gcc-multilib 
> sudo apt install libx32stdc++-5-dev 

が続いsimlple 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 
関連する問題