Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.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 从共享对象本身获取其运行时路径_C_Linux_Windows_Macos_Shared Libraries - Fatal编程技术网

C 从共享对象本身获取其运行时路径

C 从共享对象本身获取其运行时路径,c,linux,windows,macos,shared-libraries,C,Linux,Windows,Macos,Shared Libraries,给定以下库: libfoo.{so,dll,dylib}: const char* get_lib_path() { return ...; } 构建为共享库(例如使用GCC): 是否有方法获取get_lib_path()以在运行时返回库在文件系统上驻留的路径,无论是在Windows、macOS还是Linux上 库的最终名称未知:我不能假设从加载的库列表中搜索字符串“libfoo.so” 这一定不需要动态加载对象的本机句柄:我想从我的库中知道路径,但我无法控制加载它的应用程序(例如,我

给定以下库:

libfoo.{so,dll,dylib}:

const char* get_lib_path() {
    return ...;
}
构建为共享库(例如使用GCC):

是否有方法获取
get_lib_path()
以在运行时返回库在文件系统上驻留的路径,无论是在Windows、macOS还是Linux上

库的最终名称未知:我不能假设从加载的库列表中搜索字符串“libfoo.so”


这一定不需要动态加载对象的本机句柄:我想从我的库中知道路径,但我无法控制加载它的应用程序(例如,我无法获得
dlopen
句柄)。

我会说不。从技术上讲,库代码从哪里加载并不重要。一旦进入记忆,所有已知的东西都是被引用的符号之类的东西。一旦代码进入内存,原始库文件就不再相关。

在Windows上,您可以使用
GetModuleFilename
甚至更简单。后者接受库中的任何地址。

可能是mhh的副本。。我不知道库将使用哪个名称,因此我无法使用其中的解决方案。您可以使用库中的任何地址来标识模块。这将适用于
dl_iterate\u phdr
/proc/self/maps
。这在win32中如何工作?Windows具有类似的API,请检查原始库文件是否不再适用于内存中的代码。在我的例子中,它是相关的:我想在同一个文件夹中附带一个库和一些数据文件。我想找到库的路径,以便找到数据文件的路径。共享库不应该这样工作。您可以将数据发送到库中,也可以将功能放在允许某人传递搜索路径的库中。在Windows上,原始库文件仍然相关,因为内存中的代码不是副本,而是内存映射文件。
gcc -shared -fPIC foo.cpp -o libfoo.so