ELF 初期設定および終了セクションとルーチンは、オブジェクトのライフサイクルの重要なポイントで実行します。初期設定中、オブジェクトはメモリーにロードされていますが、完全には初期設定されていません。終了処理中、オブジェクトはまだメモリーにロードされていますが、もはや安全には使用できず、一部がプロセス状態から削除されている場合もあります。どちらのコンテキストでも、プロセス状態は完全には整合しておらず、安全に行えるコードについて大きな制限があります。危険性には一般に次のようなものがありますが、それだけにかぎられません。
デッドロックにつながる循環性のある依存関係。これは、あるオブジェクトの初期設定コードが別のオブジェクトのロードをトリガーし、今度はこのオブジェクトが最初のオブジェクトを呼び戻すという関係です。
スレッドシリアライズは、共有オブジェクトがマルチスレッドアプリケーションで使用されている場合に失敗します。2 つのスレッドが同時に、遅延ロードライブラリにアクセスしようとすることがあります。最初にそこにアクセスしたスレッドが、実行時リンカーにオブジェクトをロードさせ、初期設定コードの実行を開始させます。プログラマはしばしば、ELF 初期設定および終了コードの実行中に複数のスレッドが指定のオブジェクトにアクセスできないように、実行時リンカーが防止できるという間違った印象を持っていますが、これは事実ではありません。実行時リンカーは、初期設定コードが実行していると、ほかのスレッドがライブラリにアクセスしようとしてもこれを防止できません。したがって、2 番目のスレッドは不整合な状態でオブジェクトにアクセスする可能性があります。必要なロックを提供するか、呼び出し側に提供するように要求することによって、このようなアクセスをシリアライズすることはオブジェクトに任されています。
ELF 初期設定および終了セクションとルーチンでは任意のコードの実行が可能なため、通常のコンテキストで実行するコードで可能な処理を実行できるという錯覚が生じています。このように考えると、これらのコードは、明示的に関数を呼び出すことなく初期設定またはクリーンアップを行う便利な方法に過ぎないように思われます。この誤解により、診断が難しくなる可能性のある障害がもたらされます。
プログラマは、ELF 初期設定および終了コードを使用するときには注意し、操作のスコープと複雑さを抑える必要があります。リンカーと実行時リンカーは、このようなコードの内容または目的を認識せず、安全でないコードを診断することも防止することもできません。小さな自己完結型の操作が安全です。ほかのオブジェクトやプロセス状態へのアクセスを含む操作は安全でない可能性があります。ライブラリでは、初期設定および終了コードで複雑な操作を試みるのではなく、呼び出し側が実行する明示的な初期設定および終了関数を提供し、そのための要件を文書化する必要があります。
次のセクションでは、これらの問題について詳細に説明します。