【问题标题】:Portable way to determine path to dynamic library opened with dlopen确定使用 dlopen 打开的动态库的路径的便携式方法
【发布时间】:2012-02-06 16:02:07
【问题描述】:

我正在寻找一种可移植 (POSIX) 方法来确定使用 dlopen() 打开的库的路径。 dl_iterate_phdr()dladdr() 等函数不可移植。

一些man 页面详细说明了dlopen() 查找要打开的库所采用的路径(ld.so.cacheLD_LIBRARY_PATH、/lib、/usr/lib,...),因此请检查所有这些目录 可能是可能的,但不可移植。例如,在 Linux 下,我需要一种解析 ld.so.cache 的方法,但在 Mac OS X 下,没有这样的概念。

请查看previous question 了解我为什么要这样做的详细信息,因为在一般情况下使用dlopen 是不明智的。

【问题讨论】:

    标签: c++ c posix shared-libraries dlopen


    【解决方案1】:

    实际上没有任何方法可以便携地做你想做的事。真的,在没有绝对路径的情况下使用dlopen 可能是个坏主意,而且将它用于除了打算用dlopen 加载的模块之外的任何东西(由您自己的项目本身或其他项目创建和分发)也是一个坏主意您的应用程序使用的库)。如果您将它与系统库搜索路径和系统上“已经存在”的库一起使用,您将面临加载错误版本甚至错误同名库的严重风险。只要您始终将绝对路径传递给dlopen,您就可以确定您确切地知道加载了哪个文件(或者更好的是,在加载之前确切地知道将加载哪个文件)。

    如果这个答案没有帮助,也许你可以更好地解释你想要实现的目标..

    【讨论】:

    • 听起来绝对路径是要走的路,但必须确保绝对路径是正确的,否则dlopen 将开始搜索路径。请参阅stackoverflow.com/questions/9038303/…,了解我想要完成的具体细节。
    • 好的,LD_LIBRARY_PATH 不是您在那里所做的正确方法。相反,您应该将学生共享库文件的完整路径名传递给您的程序,然后它可以使用完整路径名加载它。
    • @greg: 如果给定的名称不包含“/”字符,dlopen 只会搜索库路径。如果它包含“/”,则将其视为文件路径(直接传递给 open),如果该文件不退出,则不会在其他任何地方查找。
    【解决方案2】:

    简单的答案是没有。这是一个地方 Windows 领先于 Unix。

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2014-11-23
      • 1970-01-01
      相关资源
      最近更新 更多