64ビットプログラムで32ビットライブラリを使用します

64ビットプログラムで32ビットライブラリを使用することは可能ですか? ほとんどありません。 そして本当に必要な場合は? そうではなくはい!



1つのプロジェクトでは、32ビットの独自ライブラリを使用する必要があります。 Windowsでは問題はありません。すべてを32ビット以降でコンパイルします。 しかし、Linuxでは事態はさらに悪化しています。 すべてを32ビットでコンパイルし、32ビットバージョンの無料ライブラリをRPMにフックするのは見苦しく、プラグイン用のAPIもあります。 残念なプラグインのためにユーザーに32ビットコンパイラーを強制的にインストールさせたくありません。 そのため、別のプロセスで32ビットライブラリの関数を呼び出すcatからmouseへのアダプターを作成することにしました。 最初はPythonで作成したかったのですが、Pythonをバイナリにコンパイルできませんでした。 その後、PyPyのIRCチャンネルの良き人々は、Cから直接libffiを使用できると言った! それから小さいです



その結果、 runso32プログラムが作成されました。 2つのモードで動作します。 最初のモードでは、コマンドライン引数でライブラリ、関数、パラメーターの説明行、およびパラメーター自体を指定します。 現在サポートされているパラメーターは、int、unsigned int、double、ポインター、およびバイトシーケンス(バッファー)です。 プログラムは関数を呼び出し、戻り値を出力して終了します。 2番目のオプションはインタラクティブです。 プログラムは、標準入力またはファイルからコマンドを読み取ります。 まず、関心のあるすべての関数が登録されます。 次に、「CALL」で始まる各エントリは、指定された番号の関数を呼び出します。 対話モードでは、バッファーを送信する前に、その長さを指定する必要があります。 対話モードでは、すべての値はバイナリ形式のリトルエンディアンで送信されます



必要な関数を決定したら、64ビットライブラリを作成できます。 各関数を呼び出すと、目的の関数の識別子とパラメーターがrunso32に送信され、runso32から結果が取得されます。 したがって、64ビットアプリケーションの32ビットライブラリから関数を呼び出します。 遅延はありますが、これは起こりますが、プログラムの残りの部分にはほとんど見えません。



すべて準備ができているように見えますが、ソフトウェアのインターフェイスは面倒です。 次に、関数を登録して呼び出しを容易にする64ビットライブラリを作成しました。 ここで必要な関数は、versatile_callだけです。 ただし、使用する前に、グローバル構造、ライブラリ名、関数名、およびパラメーターの説明行を入力する必要があります。 この構造は、コンパイル時に入力する必要があります。 次に、versatile_call(n、...)関数を呼び出す必要があります。nは32ビットからの目的の関数の番号で、次にパラメーターリストです。バッファー長を忘れないでください。最後の引数は戻り値が書き込まれる変数へのポインターです。



ソースとRPMはここにあります: sourceforge.net/projects/runso32



All Articles