Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 解析Windows和*nix系统上的共享库路径_C_Linux_Windows_Winapi - Fatal编程技术网

C 解析Windows和*nix系统上的共享库路径

C 解析Windows和*nix系统上的共享库路径,c,linux,windows,winapi,C,Linux,Windows,Winapi,加载给定名称的共享库时,系统会根据搜索顺序或缓存在某些目录中搜索实际文件,如.dll 如何以编程方式获得给定名称的DLL的解析路径,而不实际加载它?例如,在Windows上,对于kernel32或kernel32.dll,它可能返回C:\Windows\system32\kernel32.dll,而对于给定的foo,它可能是C:\Program Files\my\app\foo.dll 若不能做到这一点,是否有其他方法来确定某个库是否属于该系统?例如,user32.dll或libc.so.6是系

加载给定名称的共享库时,系统会根据搜索顺序或缓存在某些目录中搜索实际文件,如.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上,具有LOAD_LIBRARY_AS_DATAFILE标志,该标志打开DLL而不执行您称为实际加载的操作

这可以与任何搜索顺序标志相结合是的,不止一个搜索顺序

不幸的是,您不能使用GetModuleFilename。改用

LoadLibraryEx文档还明确指出,不要使用SearchPath函数查找DLL,也不要使用注释中提到的DONT_RESOLVE_DLL_REFERENCES标志

对于Linux,有一个现有的工具ldd,其源代码可用。它确实加载了共享库,但是使用了一个特殊的环境变量LD_TRACE_LOADED_OBJECTS,按照惯例,它会导致它们跳过任何操作。由于这只是一种约定,请注意。

在Windows上,具有“加载库作为数据文件”标志,该标志打开DLL时不会执行您称为实际加载的操作

这可以与任何搜索顺序标志相结合是的,不止一个搜索顺序

不幸的是,您不能使用GetModuleFilename。改用

LoadLibraryEx文档还明确指出,不要使用SearchPath函数查找DLL,也不要使用注释中提到的DONT_RESOLVE_DLL_REFERENCES标志


对于Linux,有一个现有的工具ldd,其源代码可用。它确实加载了共享库,但是使用了一个特殊的环境变量LD_TRACE_LOADED_OBJECTS,按照惯例,它会导致它们跳过任何操作。因为这只是一个约定,请注意。

对于Mac,这个问题是密切相关的:对于Mac,这个问题是密切相关的:如何获取LoadLibraryEx返回的GetMappedFileName表单句柄所需的内存地址?@mcpiroman:除了用作标志的低位之外,LoadLibraryEx返回的HMODULE是库的基址。因此,您可以将HMODULE强制转换为指针,或者您可以先屏蔽标志位并强制转换,两者都可以工作。LOAD_LIBRARY_作为_DATAFILE有一个单独的实现,通过CreateFileW等加载和映射文件,而不是使用加载函数LdrLoadDll,因此,它不会像加载程序那样加载已知的DLL和API集,也不会将DLL作为模块加载。请改用“不解析DLL”引用。然后通过FreeLibrary释放它。@eryksun:文档中说不要使用DONT\u RESOLVE\u DLL\u引用。如果您知道将库加载为与正常DLL位置逻辑不匹配的数据文件的方法,请向Microsoft提交错误。我知道上面说不要使用它,但我怀疑API中对标志的支持是否会消失,特别是因为它的实现方式与将EXE作为模块加载完全相同。我认为他们不赞成它,这是可以理解的,因为如果不调用FreeLibrary,这是一个问题,而且如果模块还没有加载,它会受到竞争条件的影响。因此,我们当然要谨慎使用。如何获取LoadLibraryEx返回的GetMappedFileName表单句柄所需的内存地址?@mcpiroman:除了用作标志的低位之外,LoadLibraryEx返回的HMODULE是库的基址。因此,您可以将HMODULE强制转换为指针,或者您可以先屏蔽标志位并强制转换,两者都可以工作。LOAD_LIBRARY_作为_DATAFILE有一个单独的实现,通过CreateFileW等加载和映射文件,而不是使用加载函数LdrLoadDll,因此,它不会像加载程序那样加载已知的DLL和API集,也不会将DLL作为模块加载。请改用“不解析DLL”引用。然后通过FreeLibrary释放它。@eryksun:文档中说不要使用DONT\u RESOLVE\u DLL\u引用。如果您知道将库加载为与正常DLL位置逻辑不匹配的数据文件的方法,请向Microsoft提交错误。我知道上面说不要使用它,但我怀疑API中对标志的支持是否会消失,特别是因为它的实现方式与将EXE作为模块加载完全相同。我认为他们不赞成 这是可以理解的,因为如果不调用FreeLibrary,这是一个问题,而且如果模块还没有加载,它会受到竞争条件的影响。我们当然要谨慎使用。