我正在使用一个开发系统,在其中访问函数时必须指定库名称。
以前我使用过像open()这样的函数,不知怎么的我发现它们在libc.so中。
现在我想使用lstat(),但它似乎不在libc中。不幸的是,我查看的手册没有记录函数位置。
因此,有两个问题:
- 有人能告诉我哪个库管理lstat吗?
- 我该如何一般性地找到这个信息?除了在lib文件夹中使用grep "name"之外。
我正在使用一个开发系统,在其中访问函数时必须指定库名称。
以前我使用过像open()这样的函数,不知怎么的我发现它们在libc.so中。
现在我想使用lstat(),但它似乎不在libc中。不幸的是,我查看的手册没有记录函数位置。
因此,有两个问题:
在C语言中建立一个简单的测试用例,编译并运行'ldd -r'命令以检查加载了哪些库。如果你在C语言中没有得到lstat()函数,则说明你的开发环境存在问题,或者这个环境还停留在符号链接之前的时代 :-)
ldd
的二进制文件。另外,还有 LD_DEBUG = all ./binary
以查看实际的链接过程; ld.so 将显示所请求的符号及其尝试查找它们的位置。 - osgxtomislav@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$
nm lib*.so* | grep lstat
。 - Martin Wickmanlstat()
,这是在此处实现的Perl函数。这与底层系统调用关系不大。 - ephemient#!/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
-D
标志使用 nm
命令?在 Linux 上还有 /lib
目录;因此,我们应该检查 /etc/ld.so.conf
和 /etc/ld.so.conf.d/*
中的搜索路径以查找库。 - osgx试试这个:
$ 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]
来自 manpage(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);
lstat
在libc中,而libc默认链接。你不需要做任何事情来使用lstat
,除了包含它的头文件#include <sys/stat.h>
手册页面通常会说明它们所在的库。
nm lib*.so* | grep lstat
。未经测试,因此只是注释,而不是答案。 - Martin Wickmannm
命令中使用-D
选项来显示动态符号而不是普通符号。 - jschmier