「共有オブジェクトからセグメントをマップできませんでした」というエラーはどういう意味ですか?

「共有オブジェクトからセグメントをマップできませんでした」というエラーはどういう意味ですか?

他の質問に対する多くの回答は、「共有オブジェクトからセグメントをマップできませんでした」という形式のエラーの解決に役立ちますが、通常、それらの回答は非常に具体的なものなので、他の問題に適用するのは難しいと思います。一方、このエラー全般については何も見つかりません。

このエラーの基本的な説明と(理想的には)いくつかの一般的な原因を教えていただけますか?

たとえば、どのエンティティがエラーを発生させるのか (カーネル、プロセス、プログラム?)、またその一般的な理由 (ほとんどすべてのライブラリが読み取り可能とマークされているのに、なぜそこからマップできないのか?) を知っておくと便利です。

私は現在 Ubuntu を実行していますが、これは多くのディストリビューションに当てはまるのではないかと思います。

答え1

このメッセージは、動的リンカー ( ld.so(8)) または動的ロード機能 ( dlopen(3)) によって生成されます。

質問に直接お答えします:a)そのないカーネルからb)これはユーザーモードのプロセスからのものですc)これは通常、プログラムのメインコードによって生成されるのではなく、それをロードする動的リンカーまたはそれが使用する動的ライブラリによって生成されます(libdl.so)およびd)セグメントがファイルから読み取れるという事実は、mmap適切な保護 (実行可能ファイルなど) で ed できること、またはmmap必要なアドレスで ed できること (MAP_FIXED置き換える必要がある既知のマッピングのアドレスではなく、偽のアドレスを使用する場合) を意味するものではありません。

elf/dl-load.hさらに詳しく知りたい場合は、glibcのソースコードで次のように定義されていることがわかります。DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT、そして、_dl_map_segments()静的関数。それ自体は_dl_map_object()=>経由で呼び出され_dl_map_object_from_fd()_dl_map_object()動的リンカーから直接呼び出されるか、または.dl_open最終的に によって呼び出されるコールバック経由で呼び出されますdlopen(3)

関連情報