
他の質問に対する多くの回答は、「共有オブジェクトからセグメントをマップできませんでした」という形式のエラーの解決に役立ちますが、通常、それらの回答は非常に具体的なものなので、他の問題に適用するのは難しいと思います。一方、このエラー全般については何も見つかりません。
このエラーの基本的な説明と(理想的には)いくつかの一般的な原因を教えていただけますか?
たとえば、どのエンティティがエラーを発生させるのか (カーネル、プロセス、プログラム?)、またその一般的な理由 (ほとんどすべてのライブラリが読み取り可能とマークされているのに、なぜそこからマップできないのか?) を知っておくと便利です。
私は現在 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)
。