c - 在 Windows 和 *nix 系统上解析共享库路径

标签 c linux windows winapi

当加载给定名称的共享库时,系统会根据搜索顺序或在缓存中搜索某些目录中的实际文件(例如 .dll)。

如何以编程方式获取给定名称的 DLL 的解析路径,但不实际加载它?例如。在 Windows 上,对于 kernel32kernel32.dll 它可能会返回 C:\windows\system32\kernel32.dll 而给定 foo 它可以是 C:\Program Files\my\app\foo.dll

如果做不到,是否有另一种方法来确定某个库是否属于系统?例如。 user32.dlllibc.so.6 是系统库,但 avcodec-55.dllmyhelperslib.so不是。

我对适用于 Windows、Linux 和 Mac OS 的解决方案很感兴趣。

最佳答案

在 Windows 上,LoadLibraryEx具有 LOAD_LIBRARY_AS_DATAFILE 标志,它可以在不执行您称为“实际加载它”的操作的情况下打开 DLL。

这可以与任何搜索顺序标志结合使用(是的,不止一个搜索顺序)。

很遗憾,您不能使用 GetModuleFilename。使用 GetMappedFileName相反。

LoadLibraryEx 文档还特别指出使用SearchPath 函数定位 DLL,使用注释中提到的 DONT_RESOLVE_DLL_REFERENCES 标志。


对于 Linux,有一个现有的工具 ldd,它的源代码是可用的。它确实加载了共享库,但是设置了一个特殊的环境变量 LD_TRACE_LOADED_OBJECTS 按照惯例会导致它们跳过任何操作。因为这只是一个约定,请注意 malicious files can perform actions when loaded by ldd CVE-2009-5064 .

关于c - 在 Windows 和 *nix 系统上解析共享库路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55983045/

相关文章:

c - SSE:跨页边界的未对齐加载和存储

读取文本文件的 C 代码未找到 EOF(文件结尾)

c - XCode C 项目不显示文件夹 "Tree"

找不到 libcrypto 库错误

windows - 为什么 'git log' 在 Windows 7 64 上这么慢?

python - Virtualenv 没有正确安装

c++ - 邮寄消息 : Guaranteed to be delivered?

python - 使用 eBPF 在 Python 堆栈级别跟踪代码是否可行?

c - 替换 linux 内核模块中的 sys/socket.h?

c - 信号处理程序为什么在处理相同信号时被阻塞