s******o 发帖数: 2233 | 1 比如知道有一个libA.so已经调入内存了,如何通过c/c++找到这个libA.so的full path?
command line下可以通过lsof查看,windows下可以通过GetModuleHandle()/
GetModuleHandleName()来查看,不知道Linux下有啥类似的没有?(dladdr貌似需要一
个func ptr而不是module name) |
p***o 发帖数: 1252 | 2 你popen一下lsof?
path?
【在 s******o 的大作中提到】 : 比如知道有一个libA.so已经调入内存了,如何通过c/c++找到这个libA.so的full path? : command line下可以通过lsof查看,windows下可以通过GetModuleHandle()/ : GetModuleHandleName()来查看,不知道Linux下有啥类似的没有?(dladdr貌似需要一 : 个func ptr而不是module name)
|
t****t 发帖数: 6806 | 3 lsof reads /proc filesystem (as you could guess from the output of the
command). you may do the same.
path?
【在 s******o 的大作中提到】 : 比如知道有一个libA.so已经调入内存了,如何通过c/c++找到这个libA.so的full path? : command line下可以通过lsof查看,windows下可以通过GetModuleHandle()/ : GetModuleHandleName()来查看,不知道Linux下有啥类似的没有?(dladdr貌似需要一 : 个func ptr而不是module name)
|
s******o 发帖数: 2233 | 4 这个有点hack的感觉。。。
还要一行行parse所有的output才能找到需要的那个,或者万一没有装lsof的话就不work,不太给力啊
【在 p***o 的大作中提到】 : 你popen一下lsof? : : path?
|
d*********8 发帖数: 2192 | 5 man dlopen
Glibc extensions: dladdr() and dlvsym()
Glibc adds two functions not described by POSIX, with prototypes
#define _GNU_SOURCE
#include
int dladdr(void *addr, Dl_info *info);
void *dlvsym(void *handle, char *symbol, char *version);
The function dladdr() takes a function pointer and tries to resolve
name and file where it is located. Information is stored in the Dl_info
strucâ€
ture:
typedef struct {
const char *dli_fname; /* Pathname of shared object that
contains address */
void *dli_fbase; /* Address at which shared object
is loaded */
const char *dli_sname; /* Name of nearest symbol with
address
lower than addr */
void *dli_saddr; /* Exact address of symbol named
in dli_sname */
} Dl_info;
If no symbol matching addr could be found, then dli_sname and dli_
saddr are set to NULL.
dladdr() returns 0 on error, and non-zero on success.
The function dlvsym(), provided by glibc since version 2.1, does the
same as dlsym() but takes a version string as an additional argument. |