在加载共享库的名称时,系统会根据搜索顺序或在缓存中的某些目录中搜索实际文件(例如.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的解决方案感兴趣。
答案 0 :(得分:5)
在Windows上,LoadLibraryEx
具有LOAD_LIBRARY_AS_DATAFILE
标志,该标志将打开DLL,而不执行您称为“实际加载”的操作。
这可以与任何搜索顺序标记结合使用(是的,不止一个搜索顺序)。
很遗憾,您不能使用GetModuleFilename
。请改用GetMappedFileName
。
LoadLibraryEx
文档还明确指出 not 使用SearchPath
函数来定位DLL,而 not 使用DONT_RESOLVE_DLL_REFERENCES
评论中提到的标志。
对于Linux,现有的工具ldd
可以使用其源代码。它实际上确实加载了共享库,但是设置了特殊的环境变量LD_TRACE_LOADED_OBJECTS
,按照约定,它们会跳过所有操作。因为这只是一个约定,所以请注意malicious files can perform actions when loaded by ldd
CVE-2009-5064。