マニュアルページの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です)。
manページには、dli_fnameの「アドレスを含む共有オブジェクトのパス名」およびl_nameの「オブジェクトが見つかった絶対パス名」と表示されます。私はコンパイル時に絶対パス名を探していたので、-g3コンパイルフラグには多くの情報が格納されていて、手動で書かれているように、「相互に排他的ではない」(ただし相互排他的であるように見えます)私は決してどこでも見たことのないコンパイル時の絶対パス名(素晴らしい機能)として。 –
>マニュアルページには...オブジェクトが見つかった絶対パス名 "l_nameのために - それは*言うものではありません*そのテキストは' link.h'から*引用されています。 –