如何查找包含特定功能代码的SO文件的名称

如何查找包含特定功能代码的SO文件的名称

我正在创建一个 dotnet core 项目,并想使用 P/Invoke 调用一些 Linux 系统函数。如何找到所需功能所在的 .so 文件?

例如。要使用 getpid,我需要添加此导入 -

[DllImport("libc.so.6")]

网络连接器手册页建议我们仅使用 NLMSG_DATA 来解析从连接器接收的数据,并且我想从我的 C# 代码中调用此方法。如何找出要导入哪个 so 文件?

答案1

要在 GNU 系统上找出哪些动态库导出哪些符号,您可以尝试以下操作:

ldconfig -p |
  sed -n 's/.* => //p' |
  sort -u |
  xargs -d '\n' nm --defined-only -oDg |
  grep -w getpid

(在第一个近似值中;可以通过在索引节点级别删除重复项来改进)。

可以使用静态库或任何 ELF 或支持的其他对象来完成类似的操作nm,尽管您可能需要调整标志以及如何收集要搜索的文件列表。

然而在这里,NLMSG_DATA全大写更有可能是 C 预处理器宏。

$ grep -r NLMSG_DATA /usr/include
/usr/include/linux/netlink.h:#define NLMSG_DATA(nlh)  ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))

要在 C 头文件中查找定义,grep您可能需要使用一些代码索引工具,例如ctags, cscopeorgtags以及索引整个/usr/include.

您还可以使用 C 预处理器来扩展它:

printf '%s\n' '#include <linux/netlink.h>' 'please_describe[NLMSG_DATA(nlh)]' |
  gcc -P -E -x c - | sed '/please_describe/,$!d'
please_describe[((void*)(((char*)nlh) + ((0) + ((int) ( ((sizeof(struct nlmsghdr))+4U -1) & ~(4U -1) )))))]

因此,它只是根据输入指针的大小返回一个与输入指针有一定偏移的指针struct nlmsghdr(您可以使用 C 编译器或调试使用该指针的某些对象的符号来确定该指针struct)。

请注意,运行软件不需要标头,只需构建它们,默认情况下不会为所有库安装它们,因此您可能需要安装一些xxx-devxxx-devel软件包来引入它们。

当您确实拥有库函数的手册页(此处并不真正适用,因为它是某些内核 API)时,您很可能还拥有头文件。您可以从手册页到包,然后到标头和库。例如在 Debian 和该attr_setf函数的衍生版本上:

$ man -w attr_setf
/usr/share/man/man3/attr_set.3.gz
$ dpkg -S /usr/share/man/man3/attr_set.3.gz
libattr1-dev:amd64: /usr/share/man/man3/attr_set.3.gz
$ dpkg -L libattr1-dev | grep /include/
/usr/include/attr
/usr/include/attr/attributes.h
/usr/include/attr/error_context.h
/usr/include/attr/libattr.h
/usr/include/attr/xattr.h

对于库,您可以猜测该包或使用该包将依赖于运行时包这一libattr1事实:-dev

$ apt-cache show libattr1-dev | grep Depends
Depends: libc6-dev | libc-dev, libattr1 (= 1:2.4.47-2build1)
$ dpkg -L libattr1 | grep /lib/
/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu/libattr.so.1.1.0
/lib/x86_64-linux-gnu/libattr.so.1
$ nm -Dg /lib/x86_64-linux-gnu/libattr.so.1 | grep attr_setf
00000000000016e0 T attr_setf

如果您没有手册页,但知道它存在,您可以从以下位置查找可用的软件包:

$ apt-file search -x 'man.*/attr_set\.\d'
libattr1-dev: /usr/share/man/man3/attr_set.3.gz
ncurses-doc: /usr/share/man/man3/attr_set.3ncurses.gz

相关内容