В соответствии с man-страницей extra_info содержит абсолютный путь. Я не уверен в том, что правильно понял страницу man, но я не могу получить абсолютное имя пути к файлу. Вот то, что я пробовал: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 не являются взаимоисключающими, возвращая имена путей, по крайней мере, на странице руководства. (версия gcc - 4.8.x).
man-страница говорит «Путь общего объекта, который содержит адрес» для dli_fname и «Абсолютное имя пути, где был найден объект» для l_name.Поскольку я искал абсолютный путь во время компиляции, поскольку -g3-флаг компиляции хранит много информации, и, как упоминалось мной в соответствии с руководством, похоже, что «не являются взаимоисключающими» (но похоже, что они взаимоисключающие), я взял это как абсолютное имя пути компиляции (отличная функция), которую я никогда нигде не видел. –
> man-страница говорит ... Абсолютное имя пути, где был найден объект "для l_name - это * не означает, что этот текст * цитируется * из' link.h'. –