确定哪个Linux系统库包含函数

确定哪个Linux系统库包含函数,linux,shared-libraries,Linux,Shared Libraries,我使用的是一个dev系统,当访问其中的函数时,我必须指定lib名称 我以前使用过类似open()的函数,但不知怎的发现它们在libc.so中 现在我想使用lstat(),但它似乎不在libc中。遗憾的是,我看到的手册页没有记录函数的位置 因此,有两个问题: 有人能说出哪个库承载lstat吗 我怎样才能大致了解这一点?除了对lib文件夹中的所有文件使用grep“name”之外,我的意思是 从手册页(man lstat)中: LSTAT(P) 名称 lstat-获取符号链接状态 提要 #包括 int

我使用的是一个dev系统,当访问其中的函数时,我必须指定lib名称

我以前使用过类似open()的函数,但不知怎的发现它们在libc.so中

现在我想使用lstat(),但它似乎不在libc中。遗憾的是,我看到的手册页没有记录函数的位置

因此,有两个问题:

  • 有人能说出哪个库承载lstat吗
  • 我怎样才能大致了解这一点?除了对lib文件夹中的所有文件使用grep“name”之外,我的意思是
  • 从手册页(man lstat)中:

    LSTAT(P)
    名称
    lstat-获取符号链接状态
    提要
    #包括
    int lstat(const char*restrict path,struct stat*restrict buf);
    
    这是一种方法:

    tomislav@malik:~$ cd /usr/lib
    tomislav@malik:/usr/lib$ grep "lstat()" *
    Binary file libperl.so.5.10 matches
    Binary file libperl.so.5.10.0 matches
    tomislav@malik:/usr/lib$ 
    

    lstat
    位于libc中,默认情况下,libc链接在中。使用
    lstat
    不需要做任何事情,只需包含它的头文件
    #include


    手册页通常说明它们在哪个库中。

    用C构建一个简单的测试用例,编译它并在其上运行'ldd-r'以检查加载了哪些库。如果您没有在C中获得lstat(),那么您的开发环境就有问题了。或者这个env可以追溯到符号链接时代之前:-)

    当我在Linux上交叉编译Windows应用程序时,如果我有链接问题,我倾向于使用我命名为mingw findin的脚本。类似的脚本也可以用于常规Linux编译,只需使用常规nm,而不是使用mingw替代方案,并在/usr/lib中查找,而不是查找带前缀的交叉编译目录。要使用此脚本,我运行

    /mingw findin nameoff函数

    代码如下:

    #!/bin/sh
    liblist=` ls /usr/x86_64-w64-mingw32/lib `
    
    for i in $liblist
    do
    
    if x86_64-w64-mingw32-nm /usr/x86_64-w64-mingw32/lib/$i | grep -q $1; then
            echo $i
            x86_64-w64-mingw32-nm /usr/x86_64-w64-mingw32/lib/$i | grep $1
    fi
    
    done
    
    试试这个:

    $ cat ./foobar.c
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    int main(void)
    {
        struct stat buf;
        return lstat(".", &buf);
    }
    
    
    $ LD_DEBUG=bindings ./foobar 2>&1   | grep stat
    31000:  binding file ./foobar [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: \
    normal symbol `__lxstat' [GLIBC_2.2.5]
    
    $cat./foobar.c
    #包括
    #包括
    #包括
    内部主(空)
    {
    结构统计buf;
    返回lstat(“.”,&buf);
    }
    $LD|u DEBUG=bindings./foobar 2>&1| grep stat
    31000:将文件./foobar[0]绑定到/lib/x86_64-linux-gnu/libc.so.6[0]:\
    标准符号“\uuulxstat”[GLIBC\u2.2.5]
    
    OP想知道函数最终存储在哪个库中,而不是什么头文件。libperl?那不可能是对的。请改用“nm”命令。例如
    nm lib*.so*| grep lstat
    。是的,grep还显示导入,我相信,因此libperl.libperl匹配的结果是错误的,因为它包含字符串
    lstat()
    ,这是在这里实现的Perl函数。这与底层的系统调用没有什么关系。您不能使用“nm”命令执行此操作:
    nm lib*.so*| grep lstat
    。未经测试,因此注释not answer.lstat在libc中不作为符号出现,它似乎被称为_lxstat,这可能在链接时得到解决不幸的是,我从中得到的只是一长串“nm:libXXX.sp.N:no symbols”。古怪的也许我的系统中有什么东西损坏了。nos-uu lxstat确实在那里,但它似乎不起作用-它不断返回-1。我猜这是因为它有更多或不同的参数。(更新)确实-我应该先检查头文件。它是在那里声明的。对于动态对象,例如共享库,
    -D
    选项需要与
    nm
    一起显示动态符号,而不是普通符号。我想我清楚地指出,这不是关于C,而是关于需要显式指定lib的开发环境。尽管如此,它在libc中,所以链接到libc。如果这是一个与linux机器上通常存在的环境几乎没有关系的环境,那么您需要告诉我们这是什么样的环境。除了它的文档之外,没有什么现成的方法可以知道函数驻留在哪里——这有时是缺少的。nos——我在libc中找不到它的唯一原因是它没有在那里声明,正如您在上面指出的那样。我现在已经解决了,谢谢。好主意。在本例中,问题实际上是lib中实际上没有lstat,只有uu lxstat。但这可以在标题中看到。如果有来自未知函数且默认库中没有链接的函数,这种想法就不太好了。在库名称添加到二进制链接之前,将没有可运行的二进制文件。PS:还有
    LD_DEBUG=all./binary
    来查看实际的链接过程;ld.so将显示询问的符号以及在何处尝试查找它们。或者使用
    -D
    标志显示
    nm
    ?在linux上还有/lib;因此,我们应该检查/etc/ld.so.conf和/etc/ld.so.conf.d/*以查找库的搜索路径。
    $ cat ./foobar.c
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    int main(void)
    {
        struct stat buf;
        return lstat(".", &buf);
    }
    
    
    $ LD_DEBUG=bindings ./foobar 2>&1   | grep stat
    31000:  binding file ./foobar [0] to /lib/x86_64-linux-gnu/libc.so.6 [0]: \
    normal symbol `__lxstat' [GLIBC_2.2.5]