转自:http://www.360doc.com/content/17/1012/11/48326749_694292472.shtml

另外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

本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/7655414.html,如需转载请自行联系原作者

在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全【转】...相关推荐

  1. 编写Java程序,判断一个email地址是否合法

    编写Java程序,判断一个email地址是否合法(提示:只需要判断@和.即可) 源代码: package com.lzg.class4;public class Demo03 {public stat ...

  2. linux函数地址获取函数名,函数名/函数地址/函数指针

    函数指针:1.指针变量 2.指针变量指向函数 这正如用指针变量可指向整型变量.字符型.数组一样. 在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址. 可利用该指针变量调用函数, ...

  3. linux程序防逆向,一个简单LINUX程序的逆向

    开始之前的准备: 反汇编:IDA 十六进制编辑器: Hexworkshop LINUX环境: KALI LINUX 调试: EDB (KALI自带的) 用16进制打开看看,前面有个明显的ELF标志 然 ...

  4. linux给网卡添加一个ip地址,linux网络配置中如何给一块网卡添加多个IP地址

    汤向峰每日一题-2017年3月16日: linux网络配置中如何给一块网卡添加多个IP地址 linux系统给网卡配置VIP的方法常见有两种:别名IP.以及辅助IP ================== ...

  5. c语言程序中的函数的函数名,一个C语言程序是由一个或多个函数组成的,其中必须包含一个函数,函数名是mian。...

    解析: [解析题]绿茶的茶水比一般是1:50. [解析题]以下程序的输出结果是 ________ . struct HAR { int x;int y;struct HAR *p;}h[2];int ...

  6. linux编程获取本机IP地址的三种方法

    这是一项不太清晰而且没有多大意义的工作.一个原因是网络地址的设置非常灵活而且都是允许用户进行个性化设置的,比如一台计算机上可以有多块物理网卡或者虚拟网卡,一个网卡上可以绑定多个IP地址,用户可以为网卡 ...

  7. 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )

    文章目录 一.进程注入原理 二.远程调用流程 ( 获取 so 动态库地址 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 ) 一.进程注入原理 调试进程 At ...

  8. 【Socket网络编程】3.字节序转换函数htons、htonl ,地址转换函数inet_ntoa、inet_ntop、inet_pton、inet_addr

    字节序转换函数htons.htonl 地址转换函数inet_ntoa.inet_ntop.inet_pton.inet_addr 1.字节序转换函数 #include <arpa/inet.h& ...

  9. Linux内核出错的栈打印详解,linux内核中打印栈回溯信息 - dump_stack()函数分析

    简介 当内核出现比较严重的错误时,例如发生Oops错误或者内核认为系统运行状态异常,内核就会打印出当前进程的栈回溯信息,其中包含当前执行代码的位置以及相邻的指令.产生错误的原因.关键寄存器的值以及函数 ...

  10. C++虚表地址和虚函数地址

    C++虚表地址和虚函数地址 虚函数是c++实现多态性的一个重要知识点,本文主要解析虚函数在内存中的地址,以及与虚表地址的关系. 声明一个类,包含两个虚函数,一个普通成员函数和一个类成员. 调试程序,查 ...

最新文章

  1. GridView 模版列编辑状态Dropdownlist 事件
  2. DEDECMS模块插件制作举例-模块生成向导
  3. 节流函数(throttle)的原理
  4. 「神策 2020 数据驱动用户大会」开幕在即,10 月 13-14 日,八城联动·北京场,带你一起见证数据的力量!
  5. 10 windows 启动虚拟机报错_Windows 系统如何安装 Docker
  6. java postgresql json_java – 将PostgreSQL JSON列映射到Hibernate值类...
  7. lucene详细说明文档
  8. 解压mysql server_2018-05-09 MySql-server解压缩版安装及配置
  9. linux系统下如何使用U盘、光盘、软盘?如何挂载U盘,光盘镜像?
  10. Spring基础面试题-同步更新
  11. 缺陷管理规范--bug管理流程
  12. Openstack命令
  13. 计算机相关技能简历,简历计算机技能有哪些
  14. C语言通讯录管理系统开发
  15. Java的常用集合框架
  16. SPSS应用多元逻辑回归解决无序多分类问题
  17. 最新版Nginx安装教程来了,快来看看
  18. h5 iOS 刘海屏适配
  19. 设计黄金法则永不改变
  20. python 获取昨天的时间

热门文章

  1. Codeforces 524C Idempotent functions
  2. 程序员常用字体(vs2008字体修改方案)
  3. 减治法解决八枚硬币问题/假币问题(JAVA)----二分,三分,不知轻重的情况
  4. java里shake是什么意思_shake是什么意思_shake在线翻译_英语_读音_用法_例句_海词词典...
  5. java frame清除控件_java – 清除JFrame的组件并添加新组件
  6. WeChatTweak-微信小助手安装教程
  7. jq 下拉加载每次只执行一次_记一次 无限列表 滚动优化
  8. solaris mysql_配置Solaris下自带的MYSQL
  9. MySQL的常见命令
  10. springMvc(实现HandlerMethodArgumentResolver)自定义参数解析器