5

zOS で動的にリンクされたライブラリを作成する必要があります。コンパイラに渡されるオプションは何ですか。

また、zOS のライブラリが他のライブラリに動的にリンク [依存] されているかどうかを確認する方法。Linux には ldd があり、このリンケージを示しています。zOS ランドに「ldd」に相当するものはありますか?

4

1 に答える 1

2

あなたはそれを直接言っていませんが、C/C++ DLL を意味していると思います。他の言語でも (アセンブラーでも) 共有ライブラリーを作成できますが、手順は異なります。

まず、何をエクスポートするかを決定する必要があります。IBM の例の多くはコンパイラーの EXPORTALL ディレクティブを使用していますが、コーディング スタイルによっては、実行可能ファイルが非常に遅くなる可能性があることに注意してください。EXPORTALL を実行しない場合は、エクスポートするもの (コードまたはデータ) に対して #pragma export が必要になります。データ (変数) と実行可能な関数をエクスポートできることを忘れないでください...DLL 関数とデータを共有するために、これが必要になる場合があります。

次に、クライアント (呼び出し元) と DLL の両方でコンパイル オプションを設定して、DLL リンケージを使用する必要があります。 DLL。DLL を完全に置き換えずに更新する必要があると思われる場合は、エクスポートされた関数に #pragma csect を含めることもお勧めします。

DLL をリンクするときは、必ず -Wl,DLL オプションを指定してください (方法はたくさんあります...バッチでリンクする場合、この部分は異なります - ある種の make ファイルでビルドしていると仮定しています)。リンクは、実際の DLL と、エクスポートされたすべての関数の「IMPORT」ステートメントを含む「サイド デック」を生成します。これらは、DLL を呼び出すクライアント側プログラムをリンクするために必要です。たとえば、インポートが AAA.x というファイルにある場合、c89 -Wc,DLL myapp.c AAA.x は、AAA.x の関数がある種の DLL でオフになっていることを認識して、呼び出しコードをコンパイルします。

他の DLL を呼び出す DLL についてのポイントとして、DLL は関数を「提供」および「消費」できることを忘れないでください。他の DLL を呼び出して他の DLL にアクセスします。

実際の DLL 自体は、アプリの性質に応じて複数の場所に存在する可能性があります。UNIX サービスに慣れている場合、これは LIBPATH の単なる実行可能ファイルです。STEPLIB、LNKLST、LPA などの場合もあります。

必要に応じて、dlopen()、dlsym() などを使用して、実行時に明示的に DLL にアクセスできます。一般に、これにより、使用している DLL を正確に制御でき (ユーザーが自分で提供できる場合に便利な場合があります)、DLL 内で解決される関数ポインターに相当するものが得られます。

コードが再入可能であることを確認するなど、リンク時に考慮すべきその他の基本事項がいくつかあります。これらのほとんどは IBM のドキュメントに詳しく説明されており、「c89」(または同等のもの) などでビルドすると、通常は正しいオプションが自動的に設定されます (実際、何が起こっているのかをよく理解するには、詳細な出力で、すべてのパラメーターを自分で確認してください)。

何が何を呼び出すかの相互参照を作成する必要がある場合は、UNIX サービスの「nm」コマンドでその情報を得ることができます。詳細なリンク エディット リストを作成すると、DLL をビルドするときにすべてのデータもそこに含まれます。

幸運を!

于 2015-11-27T18:53:13.823 に答える