他の質問に対する回答の多くは、「共有オブジェクトからセグメントをマッピングできません」という形式のエラーに役立ちますが、他の質問には適用しにくい非常に具体的な答えがあることがよくあります。一方、このエラーに関する一般的な情報は見つかりません。
誰もがこのエラーの基本的な説明と(理想的に)いくつかの一般的な原因を提供できますか?
たとえば、エラーを引き起こすエンティティ(カーネル、プロセス、プログラム?)と一般的な理由(たとえば、ほとんどすべてのライブラリが読み取り可能とマークされているため、ここでマッピングできないのはなぜですか)を知ることをお勧めします。
私は現在Ubuntuを実行していますが、これは多くのディストリビューションで動作すると思います。
答え1
ld.so(8)
このメッセージは、動的リンカー()または動的ロードツール()によって生成されますdlopen(3)
。
あなたの質問に直接答えるには:ㅏ)それいいえカーネルから雨)ユーザーモードプロセスに由来します。氏)これは通常、プログラムのメインコードではなく、それをロードする動的リンカーまたは使用中の動的ライブラリ(libdl.so
)とディ)ファイルからセグメントを読み取ることができるという事実は、正しいmmap
保護(実行可能ファイルなど)を使用して編集できるわけではなく、目的のアドレスmmap
で編集できるという意味ではありません(MAP_FIXED
代わりに間違ったアドレスを使用する場合)。そのアドレス)は既知のマッピングで置き換える必要があります。
詳細については、glibcソースコードに次elf/dl-load.h
のように定義されていることを確認してください。DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT
、次のように返すことができます。_dl_map_segments()
_dl_map_object()
=>を介して独自に呼び出され、_dl_map_object_from_fd()
動的_dl_map_object()
リンカーから直接呼び出されるか、.dl_open
最終的に呼び出されるコールバックを介して呼び出される静的関数dlopen(3)
。