2011-11-09 25 views
2

私は動的に(1を参照してください)私はCでLinuxのメモリマップ情報を表示する方法は?

dlinfo

を使用してライブラリの先頭アドレスを取得することができますC. にいくつかのLinuxのライブラリをロードしています。

しかし、ライブラリのサイズを取得するための情報はありません。

私が見つけた唯一のものは、(2を参照)1は

の/ proc/[PID] /マップ

ファイルを読み、関連する情報については、それを解析しなければならないということです。 もっと洗練された方法がありますか?

+0

私が知っているように、 'maps'を解析するのが最も簡単な方法です。なぜあなたの意見ではエレガントではないのですか? – osgx

+1

単純に以下を実行するのと比べて、文字列の解析を混乱させるのはあまり意味がありません。 'struct link_map * map; dlinfo(hLibrary、RTLD_DI_LINKMAP、&map); void * base = map-> l_addr; ' – user1036752

+0

'map-> l_name'があり、ライブラリへのパスに基づいて' stat'を実行できます。 link_mapはELFファイルのセグメント/セクションをより深く見つけ出します。 – osgx

答えて

0

(この答えはLINUX/GLIBC固有のものです)

http://s.eresi-project.org/inc/articles/elf-rtld.txt

によるとlink_map *マップがあります。 MAP-> l_map_start & MAP-> l_map_end http://www.cygwin.com/ml/libc-hacker/2007-06/msg00014.html は=いくつかのライブラリは、メモリ内の連続ではありません、ここで言ったようにそれは、ない正確なビットである

/* 
     ** Start and finish of memory map for this object. 
    ** l_map_start need not be the same as l_addr. 
    */ 
    ElfW(Addr) l_map_start, l_map_end; 

。リンクされた手紙にはいくつかの例があります。この検出する(にrtldする)非常に内部関数であることはELFセグメントとlink_mapと直接作業に基づいて、指定されたアドレスのlibのアドレス空間内のかどうか、次のとおりです。

/* Return non-zero if ADDR lies within one of L's segments. */ 
int 
internal_function 
_dl_addr_inside_object (struct link_map *l, const ElfW(Addr) addr) 
{ 
    int n = l->l_phnum; 
    const ElfW(Addr) reladdr = addr - l->l_addr; 

    while (--n >= 0) 
    if (l->l_phdr[n].p_type == PT_LOAD 
    && reladdr - l->l_phdr[n].p_vaddr >= 0 
    && reladdr - l->l_phdr[n].p_vaddr < l->l_phdr[n].p_memsz) 
     return 1; 
    return 0; 
} 

、この機能は他の代替であり、プログラムヘッダ/またはELFのセクションヘッダがロードされて見つけること

(そこlink_mapでそのような情報へのリンクです)そして、最も簡単にはmap->l_nameでいくつかstatシステムコールを使用することです - ディスクからのファイルのサイズを読み取るための巨大な検出で(不正確bssセクション)。

0

構文解析/proc/self/maps(またはおそらくpopen -ing pmapコマンド)はまだ私にとって最も簡単なようです。また、dladdr関数もあります(あなたにはいくつかのアドレスがあります)。

関連する問題