2013-04-12 23 views
16

64ビットライブラリは32ビットアプリケーションで動作できますか?たとえば、私のアプリケーションGUIは32ビットQtを使用します。私のビジネスコアは64ビットライブラリです。 OSは64ビットです。彼らは一緒に働くことができますか?ありがとう。32ビットと64ビットは一緒に動作できますか?

+0

あなたのカーネルは32/64ビットのカーネルです。あなたのカーネルはライブラリではありません。 – MSalters

+2

なぜあなたはすぐにLinuxとOSカーネルについて考えるのですか? _ "カーネル" _彼は彼のアプリケーションでコアの一種である自分のライブラリを意味するかもしれません(はい、これは実際にはそれを呼び出すために少し悪い方法ですが、一部の人はそうします)。まとめると、彼はGUIだけを含む32ビットアプリケーションといくつかのロジックを持つ別の64ビットライブラリを持っています。 –

+0

参照...私は正しかった、彼はちょうどその用語を悪用している... ':)' –

答えて

18

要約:32ビットアプリケーションを64ビットライブラリにリンクすることはできません。

64ビットOS(少なくともAMD、Intel、Sparcなどの一般的な32/64ビットプロセッサすべて)で32ビット共有ライブラリを使用して、32ビットアプリケーションを実行できます。しかし、これにはライブラリは含まれていません。

私は、x86用の64ビットLinuxカーネルを設計したチームのうち、(郊外に)参加していました。このプロジェクトをどのように技術的に進めることができるかについてのいくつかの議論がありました(プロジェクト全体と比較して、議論は数時間続きました)。この短い要約は、64ビットでは32ビットでは使用できないレジスタがあることです。また、メモリアドレスとレジスタ内の余分な32ビットの問題もあります。これらのすべては、ライブラリ自体が32ビット互換のライブラリであることを「認識」していると仮定して解決できます。しかし、基本的には32ビットライブラリになるように書かれた64ビットライブラリがあります。

"より多くのレジスタ"は一部のプロセッサには適用されないかもしれませんが、より大きなアドレス/ビット範囲のレジスタはすべての32ビットおよび64ビット互換プロセッサに当てはまります。そして私は、32ビットコードが64ビット共有ライブラリまたは静的ライブラリを呼び出すことを可能にする単一のプロセッサを認識していません。 32ビットアプリケーションをサポートするために汎用の64ビットライブラリを用意する目的に反するコードが具体的に書かれていない限り、動作しません。

編集:1つの実行ユニットを連結

上記で説明、例えば実行可能ファイル、共用ライブラリーまたは静的ライブラリーです。それは32ビットまたは64ビットのいずれかでなければなりません。

2つのプロセスが同じプロトコルを使用している限り[別のプロセス(たとえば、GUI以外のプロセスのステータスを表示するGUIアプリケーション)と通信するプロセス[通常IPCでは、とにかく32-/64-ビット変換はそれほど大きな問題ではありません]、32ビットと64ビットの1つのプロセスを持つことができます。

+0

Amigaシステム上で68kとPPCコードを含むfatバイナリを実行できる混合バイナリコードがいくつかありました。実行が1つのCPUから別のCPUに実行されたときに、スタブはコンテキスト切り替えを実行するようにリンクされていました。しかし、私が正しく覚えていれば、両方とも32bモードで走った。 – Jens

+0

-1「短いNO」。間違っています。64ビットWindows上のすべての32ビットプログラムは、64ビットOSで動作しているため、最終的に64ビットサービスを利用できます。このギャップを64ビットライブラリに橋渡しするためには、COMを含め、任意の数のテクノロジを使用できます。 –

+2

@ Alf:COMはRPCです。 RPCでは、32ビットと57ビットの間のギャップを埋めることができます。それは特別ではない。図書館が進むにつれて、WoWサブシステムには32ビットバージョンのライブラリ(DLL)が64ビットWindowsに付属しています。これは、1つのプロセスでビット数を混在させることができないためです。 – MSalters

1

Windowsで実行する場合、32b用にコンパイルされたアプリケーションは、Windows 64bホストシステム上で実行できます。つまり、64b Windowsに組み込まれているWOW64サブシステムを見てください。

は、32b用にコンパイルされたコードと64b用にコンパイルされたコードが混在している可能性があります。つまり、32b用にビルドされたライブラリは64b用のコードとリンクできず、その逆もあります。

+0

はい、それはライブラリにリンクされていません。これは、32ビットコードから64ビットカーネルにシステムコールを呼び出すシステムコールインタフェースです。それはまったく別の問題です。 –

+0

@MatsPetersson:OPは「ライブラリへのリンク」を必要としません。動作しない方法でタスクXを実行する必要はありません。逆に、OPは働く方法を尋ねます –

+0

"64ビットライブラリは32ビットアプリケーションで動作できますか?"何を意味するの? –

4

はい、それは大きな迷惑です。

まず、カーネルはライブラリとは異なります。通常、ライブラリはプロセスの仮想アドレス空間に表示されます。あなた自身のコードとアドレス空間を共有します。ライブラリルーチンの呼び出しは、単にサブルーチン呼び出しです。

これに対し、カーネルからサービスを要求する場合、プロセスは特別な命令を実行してトラップを生成します。このトラップは、プロセッサのレジスタや他の状態をメモリ(または通常はアクセスできない特殊なプロセッサレジスタ)に保存すること、プロセッサのさまざまなモードを変更してカーネルに適するようにすること、カーネルの命令を指すようにプログラムカウンタを変更する。その後、カーネルは実行中です。この時点で、プロセスが32ビットモードで実行されている間、カーネルは64ビットモードで実行されている可能性があります。しかし、カーネルはこれらの違いを認識するように設計されています。プロセスが32ビットモードで実行されていることを知っている情報とデータ構造を、カーネルが要求しているプロセスを調べて要求を確認します。カーネルは32ビットと64ビットの両方のプロセスをサポートすることができ、各タイプのプロセスを別々に扱います。

これはもちろん、使用している64ビットカーネルが32ビットプロセスをサポートしていることを前提としています。

通常、ライブラリを呼び出すときは、通常のライブラリ呼び出しはサブルーチン呼び出しなので、コードと同じモードにします。トラップは生成されず、プロセッサモードも変更されません。 32ビット・プロセスから64ビット・ライブラリーのルーチンを呼び出す必要がある場合、ヘルパー64ビット・プロセスを作成することができます。 32ビットプロセスは、ライブラリ呼び出しの要求をパッケージ化し、何らかのプロセス間通信によってその要求を64ビットヘルパープロセスに送信します。そのヘルパー・プロセスは、ライブラリ・ルーチンを呼び出し、結果を戻します。

これは当然、各ライブラリコールに重大なオーバーヘッドを追加するため、大きなニーズがあり、より良い選択肢がない場合にのみ、実行したいことです。

+0

+1カーネルコールの仕方の説明があまりにも具体的であっても、私はupvotingしています(これは典型的ですが、唯一の可能性はありません) –

1

私は正確にこれを行うアプリケーションに取り組んでいます。アプリケーションコアはx64(Qtを使用します)ですが、いくつかの機器と通信する必要があります。私はメーカーの32ビットライブラリしか持っていません。私が実装した方法は、コアとGUI用の2つのアプリケーション64ビットと、装置を制御し、QSharedMemoryを使用してメインアプリケーションと通信する32ビットを持つことです。どちらのアプリもQt(64ビットと32ビットに対応)に基づいています。

関連する問題