64ビットシステムで古い32ビット静的ライブラリ* .aをどのように使用するかは決まりますか? この古いライブラリのソースコードを入手して再度コンパイルすることはできません。 また、gccで-m32を使いたくないのは、プログラムが多くの64ビットライブラリを使用しているからです。おかげさまで 64ビットC++プログラムで32ビットライブラリを使用する
答えて
簡易回答:できません。
これは技術的には_an answer_ですが、ちょっとした工夫がうまくいくでしょう。 –
これは、実行しているプラットフォームによって異なります。たとえば、PowerPC上のOS Xでは、「Just Work」と表示されます。
x86プラットフォームでは、32ビットのライブラリを64ビットの実行可能ファイルにリンクすることはできません。実際にそのライブラリを使用する必要がある場合は、ライブラリへの呼び出しを処理するために別の32ビットプロセスを開始し、IPCのフォームを使用して、これらの呼び出しを64ビットアプリケーションとそのヘルパープロセスに渡す必要があります。ご注意ください:これは多くの面倒です。この道を始める前ににライブラリが必要であることを確認してください。
64ビットWindowsでは、32ビットのユーザーモードプロセスである限り、32ビットのコードは正常に動作します。 –
@Ben Voigt:エミュレータで実行したという印象を受けました。私はWOW64について詳しくは分かっていないので、Windows上で64ビットと32ビットのプロセスの間でどのような形式のIPCが利用できるのか分かりません。 –
@Stephen:Think WINE(エミュレータではない)。 WOW64は、OS特有のシステムコールを呼び出す一連の32ビットライブラリを提供するのとほぼ同じメカニズムです。 –
32ビットライブラリをロードするには、-m32
を使用する必要があります。
おそらく、あなたの最善の方法は、ライブラリをラップするサーバーを作成することです。次に、64ビットアプリケーションは、ライブラリをホストするプロセスとの間で通信するために、IPC(ソケット、FIFOなどのさまざまなメソッド)を使用できます。
Windowsでは、これはアウトオブプロセスCOMと呼ばれます。私は同じようなフレームワークがUNIX上にあるのかどうかはわかりませんが、同じアプローチが有効です。
x86/x86_64プラットフォームでは、これを行うことはできません。つまり、呼び出したい32ビットの関数ごとにカスタムアセンブリ言語ラッパーを記述すれば、おそらく可能性があります。しかしそれだけでも可能です。あなたがその仕事をしたいと思っていたとしても、それがうまくいくかどうかはわかりません。
これは、呼び出し規約がまったく異なるためです。 x864_64プラットフォームにはさらに多くのレジスタがあり、64ビットABI(アプリケーションバイナリインターフェイス、基本的にパラメータがどのように渡されるか、スタックフレームがどのように設定されるかなど)すべてのOSの標準がこれらを利用しますパラメータを渡すための余分なレジスタなどがあります。
これにより、32ビットおよび64ビットx86/x86_64システムのABIは完全に互換性がなくなります。翻訳レイヤーを作成する必要があります。そして、32ビットのABIは、32ビットのコードを使って、64ビットのコードを使うことが許されていないCPUのことを覚えている可能性があります。それは、おそらく変更されたものを復元する必要があるので、状態に戻ってから64ビットコードに戻ります。
これは、ポインタのこの問題についても言及していません。 64ビットアドレスから32ビットコードまでのデータ構造体へのポインタをどのように渡しますか?
- 1. 64ビットC#アプリケーションで32ビットライブラリを使用する方法はありますか?
- 2. 32ビットアプリケーションの64ビットライブラリを使用する
- 3. Visual Studio 2008のリンカーエラーC++:64ビットWindowsの32ビットライブラリ
- 4. iPhone 5sで32ビットライブラリを実行する64ビット
- 5. 32/64ビットQT C++プログラムでボリュームシャドウコピーサービスを使用する必要があります
- 6. 32ビット/ 64ビットOS?
- 7. 64ビットWindowsで32ビットCプログラムをコンパイルして実行する方法
- 8. ドライブCの問題32ビットと64ビット?
- 9. dlopenは64ビットライブラリの代わりに32ビットをロードできません
- 10. 64ビットOSで32ビットSTSを使用できますか?
- 11. 32ビットDLLを使用する64ビットJavaアプリケーション
- 12. AFNetworking - この64ビットライブラリを32ビットアーキテクチャで簡単に使用できますか?
- 13. 32ビット対64ビットのカスタムフレームワーク
- 14. 32ビット、64ビット、参照ライブラリ
- 15. Officeの32ビットdll 64ビット
- 16. ubuntu 11.10 64ビットvs 32ビット
- 17. 32ビットと64ビットのセットアッププロジェクト
- 18. 64ビット.NETアプリケーションで32ビットのアンマネージCOMサーバーを使用
- 19. 32ビットPCでのWCF開発と64ビットでの使用
- 20. Dで32ビットと64ビットの両方でコンパイルするプログラムを設計する
- 21. 64ビットvC++プログラムが32ビットモードで動作するようです。
- 22. 64ビットWindowsで32ビットdllをインポート
- 23. 64ビットllvm-gccで32ビットをビルド
- 24. EclipseでMinGW 32ビットを使って64ビットdllをビルドする
- 25. 32ビット用の64ビットplaformでアセンブリをコンパイルする
- 26. 32ビットライブラリとの64ビットファイルリンクをコンパイルする方法
- 27. 64ビットOSで32ビットVisual C#プロジェクトを開く
- 28. LD_PRELOAD_PATH(64ビット環境での32ビットアプリケーション用)
- 29. Windows 7で32ビットシェル拡張を使用する64ビット
- 30. 32ビットと64ビットマシンの両方で常に64ビットです
コードを使用して小さな32ビット仮想マシンを出荷し、そのライブラリ呼び出しをディスパッチすることができます。 –
@Kerrek:仮想マシンは不要です。プロセス外IPCのみ。 –