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

时间:2010-02-24 14:25:19

标签: linux shared-libraries

我正在使用开发系统,我必须在访问其中的函数时指定lib名称。

之前我使用过open()之类的函数,并以某种方式发现它们位于libc.so中。

现在我想使用lstat(),但看起来这个不在libc中。遗憾的是,我查看的手册页没有记录功能的位置。

所以,有两个问题:

  1. 有人可以告诉哪个lib主机lstat?
  2. 我怎样才能找到这个?除了在lib文件夹中的所有文件上使用grep“name”之外,我的意思是。

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

这是一种方法:

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$ 

答案 2 :(得分:1)

当我在Linux上交叉编译Windows应用程序时,如果我遇到链接问题,我倾向于使用这个名为mingw-findin的脚本。类似的脚本可以用于常规Linux编译,而不是使用mingw替代,使用常规nm而不是查看交叉编译前缀目录,查看/ usr / lib。要使用此脚本,我运行

./ mingw-findin NameOfFunction

以下是代码:

#!/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

答案 3 :(得分:0)

试试这个:

$ 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]

答案 4 :(得分:-1)

从联机帮助页(man lstat):

LSTAT(P)

NAME
       lstat - get symbolic link status

SYNOPSIS
       #include <sys/stat.h>

       int lstat(const char *restrict path, struct stat *restrict buf);

答案 5 :(得分:-1)

lstat位于libc中,默认情况下会链接libc。除了包含lstat的标题文件之外,您无需执行任何操作#include <sys/stat.h>

手册页通常会说明它们所在的库。