在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全【转】
转自: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程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全【转】的更多相关文章
- windows程序员开发linux程序的头一个月
开发环境选择 vim,vscode,qt,visual studio都可以做linux c++开发,但是作为windows程序员,最熟悉的还是visual stuio,加上visual studio ...
- 编写出色的GNU/Linux程序
http://advancedlinuxprogramming.com提供了本书电子版的免费下载. 1 与执行环境交互 关于参数 C语言程序的main()函数使用两个参数和执行环境交互--(int)a ...
- 节点地址的函数list_entry()原理详解
本节中,我们继续讲解,在linux2.4内核下,如果通过一些列函数从路径名找到目标节点. 3.3.1)接下来查看chached_lookup()的代码(namei.c) [path_walk()> ...
- 【网络编程一】主机字节序与网络字节序以及ip地址转换函数
在计算机设计之初,对内存中数据的处理也有不同的方式,(低位数据存储在低位地址处或者高位数据存储在低位地址处),然而,在通信的过程中(ISO/OSI模型和TCP/IP四层模型中),数据被一步步封装(然后 ...
- Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取
为什么要写这篇文章 1. 因为最近在学习<软件调试>这本书,看到书中的某个调试历程中讲了Windows的系统调用的实现机制,其中讲到了从Ring3跳转到Ring0之后直接进入了K ...
- Delphi中使用@取函数地址的问题(转)
Delphi中使用@取函数地址的问题 例如以下代码:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes ...
- 用函数的地址调用函数 C++ MFC
先说一段废话,幸亏我汇编基础(基础 基础 基础)扎实,否则这个问题真的恶心到我了正题 因为有特殊需求, 需要写一个类似于接口的功能,但是因为用到的次数不多再加上C++写接口各种麻烦所以想通过函数的地 ...
- linux内核中打印栈回溯信息 - dump_stack()函数分析【转】
转自:http://blog.csdn.net/jasonchen_gbd/article/details/45585133 版权声明:本文为博主原创文章,转载请附上原博链接. 目录(?)[-] ...
- gdb查看虚函数表、函数地址
1. 查看函数地址 看函数在代码的哪一行,使用info line就可以看到类似下面这中输出 点击(此处)折叠或打开 (gdb) info line a.cpp:10 Line 10 of &q ...
- Python函数之内置函数
截止导Python 3.6 目前内置函数有68个 以下是对这些内置函数的分类 一:作用域相关 以字典的形式返回作用域中的名字 locals # 返回本地作用域的所有名字 globals # 返回全局作 ...
随机推荐
- mac快速安装程序
homebrew:mac套件管理 官网 :http://brew.sh/index_zh-cn.html macport: 官网:https://www.macports.org/
- javascript 文字闪烁
早上突然看到CSS里面的text-decoration属性的时候,发现blink仅有的火狐浏览器都不支持了.于是想使用js来实现这一效果. <script type="text/jav ...
- NOIP2018初赛 游记
这玩意写个鬼游记啊 听说普及+提高的考两张卷子€€£也是想得出来 怎么监考还能咕咕咕的啊 怎么我到快结束了才做完啊 怎么我根本不知道初赛能带啥啊 怎么dij我都能想着对的选了错的啊 怎么我根本不知道图 ...
- [洛谷P5169]xtq的异或和
题目大意:给你一张$n(n\leqslant10^5)$个点$m(m\leqslant3\times10^5)$条边的无向图,每条边有一个权值,$q(q\leqslant2^{18})$次询问,每次询 ...
- HDU5446:Unknown Treasure——题解
http://acm.hdu.edu.cn/showproblem.php?pid=5446 求C(n,m)%(p1p2…pk)的值,其中pi均为质数. 参考:https://www.cnblogs. ...
- [bzoj] 1030 文本生成器 || AC自动机+dp
原题 给出n个字符串,求随机生成一个m长度的字符串,有多少个是可辨识的(即出现了n个字符串中的任意字符串) 正难则反 求有多少个不可辨识的,26^m-不可辨识即为答案 f[i][j]表示填到第i个字符 ...
- Linux上安装Oracle11g
1.首先是挂盘 1.1 Linux硬盘挂载步骤:查看磁盘 先查看目前机器上有几块硬盘,查看命令有两种: 命令1:# fdisk –l 命令2:# dmesg | grep sd 其中:fdisk命令说 ...
- ZOJ3874 Permutation Graph 【分治NTT】
题目链接 ZOJ3874 题意简述: 在一个序列中,两点间如果有边,当且仅当两点为逆序对 给定一个序列的联通情况,求方案数对\(786433\)取模 题解 自己弄了一个晚上终于弄出来了 首先\(yy\ ...
- javascript实现deepEqual和shallowEqual
function deepEqual(x, y) { if (x === y) { return true; } if (!(typeof x == "object" && ...
- 仅此一文让你明白ASP.NET MVC 之View的显示
有些人要问题,为什么我要学框架?这里我简单说一下,深入理解一个框架,给你带来最直接的好处: 使用框架时,遇到问题可以快速定位,并知道如何解决: 当框架中有些功能用着不爽时,你可以自由扩展,实现你想要的 ...