当加载给定名称的共享库时,系统会根据搜索顺序或在缓存中搜索某些目录中的实际文件(例如 .dll)。
如何以编程方式获取给定名称的 DLL 的解析路径,但不实际加载它?例如。在 Windows 上,对于 kernel32
或 kernel32.dll
它可能会返回 C:\windows\system32\kernel32.dll
而给定 foo
它可以是 C:\Program Files\my\app\foo.dll
。
如果做不到,是否有另一种方法来确定某个库是否属于系统?例如。 user32.dll
或 libc.so.6
是系统库,但 avcodec-55.dll
或 myhelperslib.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/