侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

dladdr函数用法详解

noerror
2022-10-19 / 0 评论 / 0 点赞 / 47 阅读 / 980 字 / 正在检测是否收录...

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

0

评论区