dladdr函数用法详解
dladdr函数简介
- 头文件包含
#include <dlfcn.h>
- 函数定义
#define _GNU_SOURCE
int dladdr(void * addr , Dl_info * info );
int dladdr1(void * addr , Dl_info * info , void ** \
- 编译链接选项
-ldl
dladdr函数常见使用错误
- 链接错误
undefined reference to `dladdr'
解决办法:添加链接选项
-ldl
- 编译错误
warning: implicit declaration of function ‘dladdr’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <dlfcn.h>
dladdr函数详细描述
函数dladdr ()确定addr中指定的地址是否位于调用应用程序加载的共享对象之一。如果是,则dladdr ()返回与addr 重叠的共享对象和符号的信息。该信息以Dl_info结构返回:
typedef struct {
const char *dli_fname; /* Pathname of shared object that
contains address */
void *dli_fbase; /* Base address at which shared
object is loaded */
const char *dli_sname; /* Name of symbol whose definition
overlaps \fIaddr\fP */
void *dli_saddr; /* Exact address of symbol named
in \fIdli_sname\fP */
} Dl_info;
如果找不到匹配addr的符号,则dli_sname和dli_saddr设置为null。
函数dladdr1 ()与dladdr ()类似,但通过参数extra_info 返回附加信息。返回的信息取决于flags 中指定的值,该值可以具有以下值之一:
- RTLD_DL_LINKMAP 获取一个指向匹配文件的链接映射的指针。extra_info参数指向一个指向link_map结构的指针(即,在
中定义为:.ip的"struct link_map\ **" )
struct link_map {
ElfW(Addr) l_addr; /* Difference between the
address in the ELF file and
the address in memory */
char *l_name; /* Absolute pathname where
object was found */
ElfW(Dyn) *l_ld; /* Dynamic section of the
shared object */
struct link_map *l_next, *l_prev;
/* Chain of loaded objects */
/* Plus additional fields private to the
implementation */
};
- RTLD_DL_SYMENT 获得指向匹配符号的ELF符号表项的指针。extra_info参数是指向符号指针的指针:"const ElfW(Sym) **" ElfW ()宏定义将其参数转换为适合硬件体系结构的ELF数据类型的名称。例如,在64位平台上,ElfW(Sym)产生数据类型名Elf64_Sym ,在
中定义为:.ip
typedef struct {
Elf64_Word st_name; /* Symbol name */
unsigned char st_info; /* Symbol type and binding */
unsigned char st_other; /* Symbol visibility */
Elf64_Section st_shndx; /* Section index */
Elf64_Addr st_value; /* Symbol value */
Elf64_Xword st_size; /* Symbol size */
} Elf64_Sym;
.ip st_name字段是字符串表的索引。st_info字段编码符号的类型和绑定。可以使用宏ELF64_ST_TYPE(st_info)(或32位平台上的ELF32_ST_TYPE())提取该类型,该宏生成以下值之一:.ts lb lb lb l。ValueDescription STT_NOTYPESymbol类型未指定STT_OBJECTSymbol是数据对象STT_FUNCSymbol是代码对象STT_SECTIONSymbol与节相关联stt_filesymbol的名称是文件名STT_COMMONSymbol是公共数据对象stt_tlsymbol是线程本地数据对象STT_GNU_IFUNCSymbol是间接代码对象te.ip可以使用宏ELF64_ST_BIND(st_info)(或32位平台上的ELF32_ST_BIND())从st_info字段中提取符号绑定,它产生以下值之一:.ts lb lb lb l。ValueDescription STB_LOCALLocal symbol STB_GLOBALGlobal symbol STB_WEAKWeak symbol STB_GNU_UNIQUEUnique symbol.te.ip st_other字段包含符号的可见性,可以使用宏ELF64_ST_VISIBILITY(st_info)(或32位平台上的ELF32_ST_VISIBILITY())提取,该宏生成以下值之一:.ts lb lb lb l。ValueDescription STV_DEFAULTDefault符号可见性规则STV_InternalProcessor特定的隐藏类STV_HIDDENSymbol在其他模块中不可用STV_PROTECTEDNot Preemptable,not exported.te
dladdr函数返回值
如果成功,这些函数返回一个非零值。如果addr中指定的地址可以匹配到共享对象,但不能匹配到共享对象中的符号,那么info->dli_sname和info->dli_saddr字段将设置为NULL。
如果addr中指定的地址不能与共享对象匹配,那么这些函数返回0。在这种情况下,错误消息是通过dlerror (3)可用的not
评论区