質問

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

また、ZOSのライブラリが他のライブラリに動的にリンクされているかどうかを確認する方法。 LinuxにLDDがあり、このリンクを示しています。 Zos Landに「LDD」に相当するものがありますか?

役に立ちましたか?

解決

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

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

次に、コンパイルオプションをに設定する必要があります 両方とも クライアント(発信者)とDLLはDLLリンケージを使用します...これは-WC、DLLコンパイルオプションであり、有効になった場合、プログラムでDLLをロードおよび管理するための追加のロジックを生成します。 DLLを完全に交換せずに更新する必要があると思われる場合は、エクスポート機能に#Pragma CSECTを含めることをお勧めします。

DLLをリンクするときは、-wl、dllオプションを必ず指定してください(多くの方法があります...バッチでリンクする場合、この部分は異なります - ある種のメーカーファイルで構築していると仮定しています)。リンクは、実際のDLLと、エクスポートされたすべての機能の「インポート」ステートメントを含む「サイドデッキ」を生成します。これらは、DLLを呼び出すと予想されるクライアント側のプログラムをリンクするために必要です。たとえば、インポートがaaa.xというファイルにある場合、c89 -wc、dll myapp.c aaa.xは、aaa.xで機能するという認識を持つ呼び出しコードをコンパイルします。

他のDLLを呼び出すDLLについてのあなたのポイントでは、DLLが「サーブ」と「消費」関数の両方ができることを忘れないでください。他のDLLを呼び出して他の人にアクセスします。

実際のDLL自体は、アプリの性質に応じていくつかの場所にあります。 UNIXサービスに優しい場合は、LibPathでの実行可能なだけです。また、steplib、lnklst、lpaなどです。

必要な場合は、dlopen()、dlsym()などを使用して、実行時にDLLSに明示的にアクセスできます。一般に、これにより、使用しているDLLを正確に制御できます(ユーザーが自分で提供できる場合は便利な場合もあります)。また、DLL内で解決される機能ポインターに何を与えますか。

コードがリエントラントであることを確認するなど、リンクする際に考慮すべき他のいくつかの基本的なことがあります。これらのほとんどはIBMドキュメントで詳しく説明されており、「C89」(または同等)などのものを構築すると、通常、正しいオプションが自動的にセットアップされます(実際、何が起こっているのかを知るために、ターンするために冗長出力で、自分のすべてのパラメーターを表示します)。

何を呼ぶものの相互参照を構築する必要がある場合、UNIXサービス「NM」コマンドはその情報を提供できます。詳細なLink-Editリストを作成すると、DLLを構築するときにもすべてのデータがあります。

幸運を!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top