在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 # 返回全局作 ...
随机推荐
- nargchk函数 matlab【转】
功能说明 验证输入参数的个数 函数语法 msgstring = nargchk(minargs, maxargs, numargs)msgstring = nargchk(minargs, max ...
- RT-thread内核对象标志flag总结
一.内核标志flag 在内核对象控制块中有一个标志成员flag(rt_uint8_t flag; ),这个标志在不同有内核对象中具有不同的含义.rt-thread的内核对象有定时器.线程.信号量.互斥 ...
- 【bzoj1507】[NOI2003]Editor /【bzoj1269】[AHOI2006]文本编辑器editor Splay
[bzoj1507][NOI2003]Editor 题目描述 输入 输入文件editor.in的第一行是指令条数t,以下是需要执行的t个操作.其中: 为了使输入文件便于阅读,Insert操作的字符串中 ...
- AngularJS注入依赖路由总结
属性 描述 $dirty 表单有填写记录 $valid 字段内容是合法的 $invalid 字段内容是非法的 $pristine 表单没有填写记录 什么事依赖注入? 依赖注入是一种软件设计模式,在这 ...
- BZOJ 3040最短路
题目描述 给定一个 NN 个点, MM 条有向边的带权图,请你计算从 SS 出发,到每个点的距离. 数据保证你能从 SS 出发到任意点. 输入输出格式 输入格式: 第一行两个整数 NN . MM ,表 ...
- CF484E Sign on Fence && [国家集训队]middle
CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...
- 洛谷 P2898 [USACO08JAN]haybale猜测Haybale Guessing 解题报告
[USACO08JAN]haybale猜测Haybale Guessing 题目描述 给一段长度为\(n\),每个位置上的数都不同的序列\(a[1\dots n]\)和\(q\)和问答,每个问答是\( ...
- HDOJ.1228 A + B (map)
A + B 点我挑战题目 点我一起学习STL-MAP 题意分析 讲字符串和数字用map对应即可 代码总览 /* Title:HDOJ.1228 Author:pengwill Date:2016-11 ...
- 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数
dalao教导我们,看到计数想容斥……卡常策略:枚举顺序.除去无效状态.(树结构) #include <cstdio> #include <cstring> #include ...
- Emmet缩写语法
缩写语法 Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 元素 可以使用元素名(如 div 或者 p)来生成 HTML 标签.Emmet 没有预定义的有效元素名的 ...