转自: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

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

  1. windows程序员开发linux程序的头一个月

    开发环境选择 vim,vscode,qt,visual studio都可以做linux c++开发,但是作为windows程序员,最熟悉的还是visual stuio,加上visual studio ...

  2. 编写出色的GNU/Linux程序

    http://advancedlinuxprogramming.com提供了本书电子版的免费下载. 1 与执行环境交互 关于参数 C语言程序的main()函数使用两个参数和执行环境交互--(int)a ...

  3. 节点地址的函数list_entry()原理详解

    本节中,我们继续讲解,在linux2.4内核下,如果通过一些列函数从路径名找到目标节点. 3.3.1)接下来查看chached_lookup()的代码(namei.c) [path_walk()> ...

  4. 【网络编程一】主机字节序与网络字节序以及ip地址转换函数

    在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然后 ...

  5. Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取

    为什么要写这篇文章 1.      因为最近在学习<软件调试>这本书,看到书中的某个调试历程中讲了Windows的系统调用的实现机制,其中讲到了从Ring3跳转到Ring0之后直接进入了K ...

  6. Delphi中使用@取函数地址的问题(转)

    Delphi中使用@取函数地址的问题   例如以下代码:unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes ...

  7. 用函数的地址调用函数 C++ MFC

    先说一段废话,幸亏我汇编基础(基础 基础 基础)扎实,否则这个问题真的恶心到我了正题  因为有特殊需求, 需要写一个类似于接口的功能,但是因为用到的次数不多再加上C++写接口各种麻烦所以想通过函数的地 ...

  8. linux内核中打印栈回溯信息 - dump_stack()函数分析【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/45585133 版权声明:本文为博主原创文章,转载请附上原博链接.   目录(?)[-] ...

  9. gdb查看虚函数表、函数地址

    1. 查看函数地址     看函数在代码的哪一行,使用info line就可以看到类似下面这中输出 点击(此处)折叠或打开 (gdb) info line a.cpp:10 Line 10 of &q ...

  10. Python函数之内置函数

    截止导Python 3.6 目前内置函数有68个 以下是对这些内置函数的分类 一:作用域相关 以字典的形式返回作用域中的名字 locals # 返回本地作用域的所有名字 globals # 返回全局作 ...

随机推荐

  1. Django+haystack实现全文搜索出现错误 ImportError: cannot import name signals

    原因是在你的settings.py或者其他地方使用了  "import haystack" 当我们使用django-haysatck库时,表面上会有haystack库,但实际上并不 ...

  2. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  3. css命名冲突解决方法

    css的命名冲突目前有几种解决方法: 1.命名约定 人为的制定一下命名规则以避免冲突,例如前缀,嵌套等 2.CSS in JS 在JavaScript中写CSS,使用工具编译为css,最常见的是sty ...

  4. [BZOJ1106/POI2007]Tet立方体大作战

    Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个 ...

  5. mybatis 根据id批量删除的两种方法

    原文:https://blog.csdn.net/qq_40010745/article/details/81032218 mybatis 根据id批量删除的两种方法   第一种,直接传递给mappe ...

  6. eclipse ide for java ee developers 开发环境搭建(J2EE) 【转载】

    使用eclipse真的有年头了,相信java程序员没有不知道它的,最近在给团队中新来的应届生做指导,专门讲解了一下Eclipse开发环境的搭建过程, 一是帮助他们尽快的熟悉IDE的使用,二也是保证团队 ...

  7. noip模拟赛 大芳的逆行板载

    题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇想,在杆子上每1厘米为一个单 ...

  8. Star sky 二维前缀和

    C. Star sky time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  9. 字符串模式匹配算法--BF和KMP详解

    1,问题描述 字符串模式匹配:串的模式匹配 ,是求第一个字符串(模式串:str2)在第二个字符串(主串:str1)中的起始位置. 注意区分: 子串:要求连续   (如:abc 是abcdef的子串) ...

  10. Moodle简介

    Moodle简介 一.概述 Moodle是Modular Object-Oriented Dynamic Learning Environment(模块化面向对象动态学习环境)的简称,中文译名为魔灯, ...