Linux:如何获取刚刚从构造函数加载的共享对象的全名?
在 Windows 上,有几个参数传递给 DllMain 构造函数:
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
);
从 hinstDLL 我可以使用 GetModuleFileName() 获取 DLL 本身的完全限定文件名:
LPTSTR str = new TCHAR[256];
int libNameLength = GetModuleFileName(hinstDLL, str, 256);
delete[] str;
在上面的示例中,str 现在包含刚刚加载的 DLL 的全名,例如, C:\Windows\System32\MyFile.dll。
在 Linux 上,没有参数传递给共享对象构造函数:
void `__attribute__` ((constructor)) on_load(void);
在这种情况下如何获取 DLL 的全名?如果您的解决方案也适用于 Mac,则额外加分。 :-)
On Windows, several arguments are passed to the DllMain constructor:
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
);
From hinstDLL I can get the fully qualified file name of the DLL itself using GetModuleFileName():
LPTSTR str = new TCHAR[256];
int libNameLength = GetModuleFileName(hinstDLL, str, 256);
delete[] str;
In the example above, str now contains the full name of the DLL just loaded, e.g., C:\Windows\System32\MyFile.dll.
On Linux, no arguments are passed to the shared object constructor:
void `__attribute__` ((constructor)) on_load(void);
How do I get the full name of the DLL in this case? Extra credit if your solution works on Mac, too. :-)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
一种极其丑陋和可怕的方法是查看 /proc/pid/maps 并查找包含正在执行的 on_load 函数地址的映射。
One supremely ugly and horrible way to do this is to look through /proc/pid/maps and look for the mapping that encompasses the address of the
on_load
function being executed.我认为 dladdr 函数可能会满足您的需求。从手册页:
因此,您只需给它一个函数指针(如构造函数本身的地址),它就会为您提供文件名和一堆其他信息。下面是一些示例代码:
编辑:看起来这个函数也存在于 OS X 上,具有相同的语义。
I think the
dladdr
function might do what you want. From the man page:So you just give it a function pointer (like the address of the constructor itself), and it will give you the filename and a bunch of other information. Here's some sample code:
EDIT: It looks like this function exists on OS X, too, with the same semantics.