我正在尝试进行一个系统调用,该调用将返回文件的索引节点号,并选择使用FTS
和FTSENT
结构,因为我在搜索时找到了它们,而且它们也在ls.c
中使用(通常的ls
程序,它与-I一起为我们提供索引节点号)。
为了保持紧凑,我在/usr/src/servers/vfs
中添加了table.c
底部的两个函数。
这就是错误(为了完整起见):
table.o: In function 'do_inode_nr':
table.c:(.text+0x1f): undefined reference to __fts_open60
table.c:(.text+0x50): undefined reference to __fts_read60
clang: error: linker command failed with code 1 (use -v for invocation)
我不能使用-v,因为我正在从/usr/src/releasetools
中使用make hdboot
进行构建。
代码:
//forward declaration of the functions before the table itself
//table and default stuff
//after all this
#include "fts.h"
int do_inode_nr()
{
FTS* s = fts_open(&m_in.m1_p1, 0, NULL);
printf("%s", s? "got inoden" : "failed to get inoden");
if(s == NULL) return -1;
FTSENT* p = fts_read(s);
printf("%d", p->fts_ino);
return p->fts_ino;
}
进一步说明:
Q: 这是一个项目吗?你是想让我们做你的家庭作业吗?A: 是的,这是一个类的项目,但很明显,我已经找到了一个我很满意的答案,并请求帮助处理链接器错误,我不是在寻求解决方案,不要侮辱我,声称我太懒了,无法独自解决它(以防万一:)
Q: 为什么使用table.c
?A: 我们要用git制作一个补丁,但众所周知,在补丁中添加新文件有点困难,所以我坚持使用table.c,它无论如何都包含在补丁中——我想说的是,我知道我通常应该把新代码放在单独的文件中等,但考虑到我不会做更多的事情,这样做真的更容易。
Q: 我是否考虑过其他选择?A: 我似乎是唯一一个转向FTS结构的人,我宁愿它按预期工作,并提交一个模式独特的解决方案,而不是只做其他人正在做的事情。一旦宽限期开始,我也会尝试另一种方式。
Q: 你查过了吗?A: 是的,想出的很少,我不能说这有任何帮助。
提前感谢您的任何帮助。
这行不通。VFS
的工作是将I/O请求向下传输到为其提供服务的正确"驱动程序"。代码中的open
和read
就是执行此类请求的方法。但是VFS
只能处理来自"用户"程序的请求;它不能自称。使用ls.c
作为源来修改VFS
是个坏主意。
您需要使用eat_path
等将对open
和read
的调用替换为它们在VFS
中的效果。