在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全路径名(转)

本文主要是介绍在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全路径名(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

gnu的扩展函数dladdr可以做到你所要的,man   dladdr可以查到帮助。   
  另外dl_iterate_phdr可以查到当前进程所装在的所有符号,每查到一个就会调用你指定的回调函数。   
    
  下面的代码示例如何使用dl_iterate_phdr和dladdr   
    
  #define   _GNU_SOURCE   
  #include   <link.h>   
  #include   <stdlib.h>   
  #include   <stdio.h>   
    
  static   int   
  callback   (struct   dl_phdr_info   *info,   size_t   size,   void   *data)   
  {   
      int   j;   
    
      printf   ("name=%s   (%d   segments)/n",   info->dlpi_name,   info->dlpi_phnum);   
    
      for   (j   =   0;   j   <   info->dlpi_phnum;   j++)   {   
          void*   addr   =   (void   *)   (info->dlpi_addr   +   info->dlpi_phdr[j].p_vaddr);   
          printf   ("/t/t   header   %2d:   address=%10p",   j,   addr);   
          Dl_info   dlinfo;   
          dladdr(addr,   &dlinfo);   
          printf("/t   %s   :   %s/n",   dlinfo.dli_fname,   dlinfo.dli_sname);   
      }   
      return   0;   
  }   
    
  int   
  main   (int   argc,   char   *argv[])   
  {   
      dl_iterate_phdr   (callback,   NULL);   
    
      exit   (EXIT_SUCCESS);   
  }   
    
    
  编译方式:   
  gcc   -o   test   test.c   -ldl   
    
  你需要复制一个so文件到当前目录,名字为libtest.so,程序的输出大概是这个样子的:   
  ......   
  ......   
  name=/lib/libdl.so.2   (9   segments)   
                                    header     0:   address=0x40039034       /lib/libdl.so.2   :   _dl_rtld_di_serinfo   
                                    header     1:   address=0x4003a9ae       /lib/libdl.so.2   :   (null)   
                                    header     2:   address=0x40039000       /lib/libdl.so.2   :   __pthread_once   
                                    header     3:   address=0x4003bed4       /lib/libdl.so.2   :   (null)   
                                    header     4:   address=0x4003beec       /lib/libdl.so.2   :   (null)   
                                    header     5:   address=0x40039154       /lib/libdl.so.2   :   _dl_rtld_di_serinfo   
                                    header     6:   address=0x40039174       /lib/libdl.so.2   :   _rtld_global   
                                    header     7:   address=0x40039000       /lib/libdl.so.2   :   __pthread_once   
                                    header     8:   address=0x4003bed4       /lib/libdl.so.2   :   (null)   
  name=/lib/tls/libc.so.6   (11   segments)   
                                    header     0:   address=0x4003d034       /lib/tls/libc.so.6   :   _rtld_global   
                                    header     1:   address=0x4014a540       /lib/tls/libc.so.6   :   (null)   
                                    header     2:   address=0x4003d000       /lib/tls/libc.so.6   :   GCC_3.0   
                                    header     3:   address=0x401505ec       /lib/tls/libc.so.6   :   (null)   
                                    header     4:   address=0x40151d3c       /lib/tls/libc.so.6   :   (null)   
                                    header     5:   address=0x4003d194       /lib/tls/libc.so.6   :   _rtld_global   
                                    header     6:   address=0x4003d1b4       /lib/tls/libc.so.6   :   _rtld_global   
                                    header     7:   address=0x401505ec       /lib/tls/libc.so.6   :   (null)   
                                    header     8:   address=0x4014a554       /lib/tls/libc.so.6   :   (null)   
                                    header     9:   address=0x4003d000       /lib/tls/libc.so.6   :   GCC_3.0   
                                    header   10:   address=0x401505f4       /lib/tls/libc.so.6   :   (null)   
  name=/lib/ld-linux.so.2   (6   segments)   
                                    header     0:   address=0x40000000       /lib/ld-linux.so.2   :   GLIBC_2.1   
                                    header     1:   address=0x40016cc0       /lib/ld-linux.so.2   :   _rtld_global_ro  
                                    header     2:   address=0x40016f34       /lib/ld-linux.so.2   :   (null)   
                                    header     3:   address=0x40015abc       /lib/ld-linux.so.2   :   (null)   
                                    header     4:   address=0x40000000       /lib/ld-linux.so.2   :   GLIBC_2.1   
                                    header     5:   address=0x40016cc0       /lib/ld-linux.so.2   :   _rtld_global_ro  
 
来自:http://topic.csdn.net/t/20060712/14/4875672.html#

这篇关于在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全路径名(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418097

相关文章

Java根据IP地址实现归属地获取

《Java根据IP地址实现归属地获取》Ip2region是一个离线IP地址定位库和IP定位数据管理框架,这篇文章主要为大家详细介绍了Java如何使用Ip2region实现根据IP地址获取归属地,感兴趣... 目录一、使用Ip2region离线获取1、Ip2region简介2、导包3、下编程载xdb文件4、J

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指