应该不难吧?正确的?

我目前正在 OpenAFS 代码库中查找 pioctl 的标头定义。我已倾尽全力:检查 ctags,grep pioctl 的源代码等。我最接近的线索是有一个文件 pioctl_nt.h 包含定义,但它实际上不是我想要的,因为没有用户空间代码直接包含它,而且它是 Windows 特定的。

现在,我不希望您去下载 OpenAFS 代码库并为我找到头文件。不过我很好奇:当其他一切都失败时,您有哪些技术可以找到所需的头文件?最坏的情况是什么可能导致代码库中的 pioctl 的 grep 实际上无法得出任何看起来像函数定义的东西?

我还应该注意到,我可以访问两个独立的用户空间程序,它们已经正确完成了这项工作,因此理论上我可以对函数进行 O(n) 搜索。但是没有一个头文件弹出给我,而且 n 很大......

编辑: 眼前的问题已经解决:pioctl() 是隐式定义的,如下所示:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’
有帮助吗?

解决方案

如果 grep -r ctags 失败,那么它可能被定义为一些令人讨厌的宏的结果。您可以尝试制作调用 pioctl()的最简单的文件并成功编译,然后对其进行预处理以查看会发生什么:

gcc -E test.c -o test.i
grep pioctl -C10 test.i

其他提示

有编译器选项可以显示预处理器输出。试试那些?在可怕的紧要关头,我的头脑完全没有任何可能的定义,-E 选项(在大多数 C 编译器中)除了吐出预处理的代码之外什么也不做。

根据要求的信息:通常,我只是在屏幕上输出时捕获相关文件的编译,然后进行快速复制和粘贴,并将 -E 放在编译器调用之后。结果会将预处理器输出喷到屏幕上,因此将其重定向到文件。仔细查看该文件,因为所有宏和愚蠢的事情都已处理完毕。

最坏的情况:

  • K&R 风格原型
  • 宏隐藏了定义
  • 隐式声明(根据您的回答)

您是否考虑过使用 cscope (可从 来源锻造)?

我在一些相当重要的代码集(25,000 多个文件,文件中最多大约 20,000 行)上使用它,并取得了良好的成功。导出文件列表需要一段时间(5-10 分钟),在古老的 Sun E450 上构建交叉引用需要更长的时间(20-30 分钟),但我发现结果很有用。


在几乎同样古老的 Mac(双 1GHz PPC 32 位处理器)上,在 OpenAFS (1.5.59) 源代码上运行的 cscope 会出现很多声明函数的位置,有时在代码中内联,有时在标头中。扫描 4949 个文件花了几分钟,生成了 58 MB 的 cscope.out 文件。

  • openafs-1.5.59/src/sys/sys_prototypes.h
  • openafs-1.5.59/src/aklog/aklog_main.c (以及评论“为什么 AFS 不提供这些原型?”)
  • openafs-1.5.59/src/sys/pioctl_nt.h
  • openafs-1.5.59/src/auth/ktc.c 包含 PIOCTL 的定义
  • openafs-1.5.59/src/sys/pioctl_nt.c 提供了它的实现
  • openafs-1.5.59/src/sys/rmtsysc.c 提供了它的实现(有时是 afs_pioctl() )

发现的 184 个实例中的其余部分似乎是该函数的使用、或文档参考、或发行说明、更改日志等。

我们决定在预处理器上找不到任何东西后,我们已经决定的当前工作原理是OpenAFS让编译器推断函数的原型,因为它返回一个整数并取指针,整数,指针,整数作为其参数。我将通过自己定义它来解决这个问题。

修改:非常好!我找到了吸烟枪:

AFS.xs:2796: error: implicit declaration of function ‘pioctl’

虽然原始的一般问题已经得到解答,但是如果有人到达此页面,想知道在哪里找到定义pioctl的头文件:

在当前版本的OpenAFS(1.6.7)中,pioctl的原型在sys_prototypes.h中定义。但是,这个问题最初被问到的时间,该文件不存在,并且没有从OpenAFS代码树外部可见的pioctl原型。

然而,pioctl的大多数用户可能想要或者至少可以使用lpioctl(“local”pioctl),它总是在本地机器上发出系统调用。 afssyscalls.h中有一个原型(现在也是sys_prototypes.h)。

这些天最简单的选择就是使用libkopenafs。为此,包括kopenafs.h,使用函数k_pioctl,并链接-lkopenafs。与尝试与OpenAFS libsys和其他东西链接相比,这往往是一个更方便的界面。

它通常在手册页简介中说出来吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top