在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
本文轉自張昺華-sky博客園博客,原文鏈接:http://www.cnblogs.com/sky-heaven/p/7655414.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的在linux程序里面,知道一个函数地址,改函数是属于某个动态库的,怎么样得到这个动态库的全【转】...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue-cli打包后的思索--代码优化
- 下一篇: 缓存系列之二:CDN与其他层面缓存