如何在Linux上获取/etc/ld.so.conf中的路径列表

如何在Linux上获取/etc/ld.so.conf中的路径列表,linux,lua,shared-libraries,debian,ldd,Linux,Lua,Shared Libraries,Debian,Ldd,获取由/etc/ld.so.conf配置的路径列表及其包含的文件的最方便、最健壮的方法是什么?手动解析文件似乎不是一个好主意-格式可能会在将来的修订中更改 为了更好地理解这个问题,我将在下面向大家介绍具体细节。请注意,尽管有这些细节,但这是一个通用的编程问题,适用于其他情况 有一个程序,叫做。它是Lua编程语言(有点像rubygems或Python-egs)的包管理器。Luarock包被称为“岩石” 作为一个方便的特性,Luarock允许rock作者为rock指定一个外部依赖项列表,其形式为C

获取由
/etc/ld.so.conf
配置的路径列表及其包含的文件的最方便、最健壮的方法是什么?手动解析文件似乎不是一个好主意-格式可能会在将来的修订中更改


为了更好地理解这个问题,我将在下面向大家介绍具体细节。请注意,尽管有这些细节,但这是一个通用的编程问题,适用于其他情况

有一个程序,叫做。它是Lua编程语言(有点像rubygems或Python-egs)的包管理器。Luarock包被称为“岩石”

作为一个方便的特性,Luarock允许rock作者为rock指定一个外部依赖项列表,其形式为C头文件和/或动态库文件列表。如果指定的文件不存在,则无法安装rock

目前,在Linux上,默认情况下,Luarock通过在两个硬编码路径中搜索文件来检查.so文件是否存在,
/usr/lib
/usr/local/lib

我认为这是不正确的行为,最近Ubuntu和其他Debian发行版中出现了这种行为

更新:路径本身不是硬编码的,但在配置文件中是用户可配置的。不过,在国际海事组织看来,这并不是最好的解决办法

相反(据我所知),Luarock应该在路径中查找文件,路径由
/etc/ld.so.conf
指定,以及其中包含的文件

(现在请重新阅读上面的问题;-)

根据,以下是动态库的有效位置:

/lib*/
/opt/*/lib*/
/usr/lib*/
/usr/local/lib*/
(也很可能是
~/lib*/

my
/etc/ld.so.conf.d/*
中的所有条目都符合此要求。有些条目引用FHS目录下的子目录,这可能意味着您可以使用其中的库而不需要路径信息

现在我对LuaRocks的了解还不够。如果您仅限于Lua路径样式的glob(仅
),则无法匹配这些glob,必须解析配置。否则,您可以尝试在这些目录中的任何位置找到它们

这将在不符合FHS的系统上中断(仅选项:parse config),如果配置中不包含目录,安装程序可能会看到链接器找不到的库

这两个对我来说似乎是可以接受的,因此我只需忽略配置并查看这些dir


(另一种可能是尝试链接库,这应该自动使用正确的路径。但是,这是特定于平台的,可能很危险。)

您不需要解析/etc/ld.so.conf或任何配置文件-如果运行“ldconfig”,它将扫描配置的目录并生成缓存文件

然后,当您尝试dlopen时,它将通过迭代缓存的库目录自动查找文件。与编译并提供-lSomeLib相同,如果在ld.so.conf(.d)中配置了-L/my/other/path,则不需要指定它


autoconf通过尝试编译链接到共享库的测试程序来实现这一点,但这只是围绕dlopen()调用的函数包装

因此,虽然其他方法未必“错误”,但从根本上说,尝试链接到库或执行dlopen()操作是“最正确”的方法

考虑到这一点,如果您试图链接到/etc/ld.so.cache中未缓存的目录中的库,那么当您尝试运行该程序时,它将失败,因为它将无法dlopen()该库

因此,任何“好的”共享库都将位于/etc/ld.so.cache中,并且可以链接/dlopen()这意味着gcc可以使用它来链接,并且用户生成的库或可执行文件将能够在执行时打开它

您可以通过明确设置环境变量LD_LIBRARY_PATH或LD_PRELOAD_PATH来避免这种情况,但每种方法都有自己的注意事项,如果可能的话,应避免“标准”使用


一篇关于编写共享库的好文章涵盖了其中的一些问题,对于任何从事其他共享库编程工作的人来说都是很好的读物

这个问题与dlopen无关:在安装rock(和库)之前,LR必须确定系统是否符合rock的合同。实际上,这是因为dlopen()是操作系统查找动态库的方式。这些问题相互交织。也就是说,如果您运行ldconfig,您不需要“搜索”库,它们会自动被找到。但是无论如何,谢谢你的否决票!您没有抓住要点—您将目录添加到/etc/ld.so.conf.d/中的文件,然后运行ldconfig,ldconfig生成/etc/ld.so.cache,然后尝试查找共享库的任何内容“gcc foo.c-lMyLib”或“ld-shared foo.c-lMyLib”或“dlopen('MyLib')”引用缓存@/etc/ld.so.cache,您不需要指定目录。这就是为什么当您安装新的共享库时,autoconf会发出一条消息说“您应该重新运行ldconfig以更新缓存”。在这一点上,您不必提供任何提示来制作/编译工具。同样,您没有抓住要点。任何东西都不应该在特定目录中查找.so文件,这就是动态库存在的原因——否则所有内容都将进入一个目录。如果无法打开该库,则它未在/etc/ld.so.conf.d/*中配置,并且表面上在系统上不可用。简而言之,任何东西都不应该“查看”/etc/ld.so.conf/*,任何这样做的方式都是错误的。这不是一个观点,而是一个事实。autoconf通过尝试编译链接到共享库的测试程序来实现这一点,但这只是围绕dlopen()调用的函数包装。因此,虽然其他方法不一定是“错误的”,但从根本上说,尝试链接到库或执行dlopen()操作是“最错误的”