2017-01-12 13 views
0

マニュアルページのextra_infoに絶対パス名が含まれています。マニュアルページを正しく理解しているかどうかは分かりませんが、ファイルの絶対パス名を取得できません。ここで私が試していたものです:Linux dladdr1():一致するファイルの絶対パス名を取得できません

ソースコード:次のようにコンパイルされた

#define _GNU_SOURCE 
#include <dlfcn.h> 
#include <link.h> 

#include <stdio.h> 

int main2(int i) 
{ 
     return 2+i; 
} 

int main(void) 
{ 
    Dl_info i={0}; 
    int r; 
// struct link_map ei_={0}, *ei=&ei_; 
    struct link_map *ei=0; 
    void *ptr = (void*)main2; 

    r = dladdr1(ptr, &i, (void**)&ei, RTLD_DL_LINKMAP); 

    if(r) 
    { 
     printf("name = %s [%s]\n", i.dli_sname, ei->l_name); 
    } 

    return 1; 
} 

gcc -g3 -rdynamic -ldl dlerr.c 

結果:

name = main2 [] 

GDBセッション:

24    printf("name = %s [%s]\n", i.dli_sname, ei->l_name); 
(gdb) 
name = main2 [] 
27   return 1; 
(gdb) p i 
$1 = {dli_fname = 0x7fffffffe5a7 "/home/user/learn/dlerr/a.out", dli_fbase = 0x400000, 
    dli_sname = 0x400674 "main2", dli_saddr = 0x4008bd <main2>} 
(gdb) p *ei 
$2 = {l_addr = 0, l_name = 0x7ffff7ffe6d8 "", l_ld = 0x600e08, l_next = 0x7ffff7ffe6e0, 
    l_prev = 0x0} 
(gdb) 

注:infoパラメータは現在必要なパスを示していますが、複雑なプロジェクトでは、デバッグ中に相対パスが表示されることがよくあります(このAPIは試していません)。ですから、manページでextra_infoが絶対パスを与えると、私はそれに依存したいと思います。 * infoと* extra_infoは、少なくともmanページごとにパス名を返す相互排他的なものではありません。 (gccのバージョンは4.8.xです)。

答えて

2

だから、ときmanページはextra_infoはmanページがそれを言っていない、絶対パスに

を与えると言います。それは、says

RTLD_DL_LINKMAP 
      Obtain a pointer to the link map for the matched file. The 
      extra_info argument points to a pointer to a link_map 
      structure (i.e., struct link_map **), defined in <link.h> as: 
    ... copy of struct link_map from link.h ... 

manページ正しいです:あなたはlink_mapへのポインタを取得します。 link.hでもですが、不完全です。何が起こっている

link_mapエントリのリストには、リンカによってロードされないELFオブジェクトのための特別のentiresがあるということです。すなわち、主実行ファイルと(古くないバージョンのglibcでは)vdsoです。

これらのエントリはカーネルによってロードされたため、link_mapには絶対パス名が含まれていません。

infoパラメータは、現在必要なパスを提供しますが、複雑なプロジェクトで、私たちはしばしば、相対パスが、それはあなたを伝えることはできませんので、メインの実行可能ファイルへのパスは、ローダによって知られていない

を印刷ばかり見つけますその実行可能ファイルはどこにありますか。

通常、このパスは、link_mapリストの最初のエントリを特別に処理することで見つけることができます。 readlink(/proc/self/exe)を使用してください。 がマウントされていない場合や、コードが実行される前にメインの実行可能ファイルが削除されていても、これらの条件は非常にまれです。

+0

manページには、dli_fnameの「アドレスを含む共有オブジェクトのパス名」およびl_nameの「オブジェクトが見つかった絶対パス名」と表示されます。私はコンパイル時に絶対パス名を探していたので、-g3コンパイルフラグには多くの情報が格納されていて、手動で書かれているように、「相互に排他的ではない」(ただし相互排他的であるように見えます)私は決してどこでも見たことのないコンパイル時の絶対パス名(素晴らしい機能)として。 –

+0

>マニュアルページには...オブジェクトが見つかった絶対パス名 "l_nameのために - それは*言うものではありません*そのテキストは' link.h'から*引用されています。 –

関連する問題