2011-07-24 2 views
6

64ビットシステムで古い32ビット静的ライブラリ* .aをどのように使用するかは決まりますか? この古いライブラリのソースコードを入手して再度コンパイルすることはできません。 また、gccで-m32を使いたくないのは、プログラムが多くの64ビットライブラリを使用しているからです。おかげさまで 64ビットC++プログラムで32ビットライブラリを使用する

+0

コードを使用して小さな32ビット仮想マシンを出荷し、そのライブラリ呼び出しをディスパッチすることができます。 –

+2

@Kerrek:仮想マシンは不要です。プロセス外IPCのみ。 –

答えて

0

簡易回答:できません。

+1

これは技術的には_an answer_ですが、ちょっとした工夫がうまくいくでしょう。 –

6

これは、実行しているプラ​​ットフォームによって異なります。たとえば、PowerPC上のOS Xでは、「Just Work」と表示されます。

x86プラットフォームでは、32ビットのライブラリを64ビットの実行可能ファイルにリンクすることはできません。実際にそのライブラリを使用する必要がある場合は、ライブラリへの呼び出しを処理するために別の32ビットプロセスを開始し、IPCのフォームを使用して、これらの呼び出しを64ビットアプリケーションとそのヘルパープロセスに渡す必要があります。ご注意ください:これは多くの面倒です。この道を始める前ににライブラリが必要であることを確認してください。

+1

64ビットWindowsでは、32ビットのユーザーモードプロセスである限り、32ビットのコードは正常に動作します。 –

+0

@Ben Voigt:エミュレータで実行したという印象を受けました。私はWOW64について詳しくは分かっていないので、Windows上で64ビットと32ビットのプロセスの間でどのような形式のIPCが利用できるのか分かりません。 –

+0

@Stephen:Think WINE(エミュレータではない)。 WOW64は、OS特有のシステムコールを呼び出す一連の32ビットライブラリを提供するのとほぼ同じメカニズムです。 –

0

32ビットライブラリをロードするには、-m32を使用する必要があります。

おそらく、あなたの最善の方法は、ライブラリをラップするサーバーを作成することです。次に、64ビットアプリケーションは、ライブラリをホストするプロセスとの間で通信するために、IPC(ソケット、FIFOなどのさまざまなメソッド)を使用できます。

Windowsでは、これはアウトオブプロセスCOMと呼ばれます。私は同じようなフレームワークがUNIX上にあるのかどうかはわかりませんが、同じアプローチが有効です。

1

x86/x86_64プラットフォームでは、これを行うことはできません。つまり、呼び出したい32ビットの関数ごとにカスタムアセンブリ言語ラッパーを記述すれば、おそらく可能性があります。しかしそれだけでも可能です。あなたがその仕事をしたいと思っていたとしても、それがうまくいくかどうかはわかりません。

これは、呼び出し規約がまったく異なるためです。 x864_64プラットフォームにはさらに多くのレジスタがあり、64ビットABI(アプリケーションバイナリインターフェイス、基本的にパラメータがどのように渡されるか、スタックフレームがどのように設定されるかなど)すべてのOSの標準がこれらを利用しますパラメータを渡すための余分なレジスタなどがあります。

これにより、32ビットおよび64ビットx86/x86_64システムのABIは完全に互換性がなくなります。翻訳レイヤーを作成する必要があります。そして、32ビットのABIは、32ビットのコードを使って、64ビットのコードを使うことが許されていないCPUのことを覚えている可能性があります。それは、おそらく変更されたものを復元する必要があるので、状態に戻ってから64ビットコードに戻ります。

これは、ポインタのこの問題についても言及していません。 64ビットアドレスから32ビットコードまでのデータ構造体へのポインタをどのように渡しますか?

関連する問題