在内核

时间:2015-07-08 20:16:56

标签: c linux function include kernel

我在将函数(ext3_get_inode_loc)调用到其他几个文件中的exec.c时出现问题。

我应该提一下,我对此很新,完全是自学成才,所以我确信我有很大的知识差距。我真正感激的是关于我缺少什么和/或在哪里寻找答案的指示或建议。

以下是来自Linux-3.10.0.123.20.1.el7目录的递归grep的结果 -

"grep ext3_get_inode_loc -R *"

fs/ext3/inode.c: 
fs/ext3/inode.c:static int __ext3_get_inode_loc(struct inode *inode,  
fs/ext3/inode.c:ext3_error (inode->i_sb, ext3_get_inode_loc",  
fs/ext3/inode.c:ext3_error(inode->i_sb, ext3_get_inode_loc",  
fs/ext3/inode.c:int ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc)  
fs/ext3/inode.c:return __ext3_get_inode_loc(inode, iloc,  
fs/ext3/inode.c:ret = __ext3_get_inode_loc(inode, &iloc, 0);  
fs/ext3/inode.c:err = ext3_get_inode_loc(inode, iloc);  
fs/ext3/inode.c:err = ext3_get_inode_loc(inode, &iloc);  
fs/ext3/ext3.h:extern int ext3_get_inode_loc(struct inode *, struct ext3_iloc *);  
fs/ext3/xattr.c:error = ext3_get_inode_loc(inode, &iloc);  
fs/ext3/xattr.c:error = ext3_get_inode_loc(inode, &iloc);  
fs/ext3/xattr.c:error = ext3_get_inode_loc(inode, &is.iloc);  

表明它仅存在于这3个文件中 -

ext3.h  
inode.c  
xattr.c  

ext3.h包含函数原型

extern int ext3_get_inode_loc(struct inode *, struct ext3_iloc *);  

inode.c和xattr.c都包含ext3.h,为两个文件提供原型

#include "ext3.h"  

inode.c包含函数定义 -

static int __ext3_get_inode_loc(struct inode *inode, struct ext3_iloc *iloc, int in_mem)
{
    ext3_fsblk_t block;
    struct buffer_head *bh;

    block = ext3_get_inode_block(inode->i_sb, inode->i_ino, iloc);
    if (!block)
            return -EIO;

    bh = sb_getblk(inode->i_sb, block);
.
.
... and so forth
}

函数调用自身 -

err = ext3_get_inode_loc(inode, iloc);

xattr.c仅包含调用,而不包括定义 -

error = ext3_get_inode_loc(inode, &iloc);

我的问题是,如果我添加完全相同的代码行 -

error = ext3_get_inode_loc(inode, &iloc);
以与xattr.c相同的方式在exec.c中执行open_exec()(没有函数定义)在使用" make"进行编译时出现以下错误 -

fs/built-in.o: In function `open_exec':
~/linux-3.10.0-123.20.1.el7/fs/exec.c:828: undefined reference to `ext3_get_inode_loc'

为什么函数可用于xattr.c而不是exec.c?我已经搜索了相当多的内容,并且已经读过这可能是由于exec.c和xattr.c之间存在链接问题(或缺少链接问题)

提前谢谢 - 罗格

1 个答案:

答案 0 :(得分:0)

ext3_get_inode_loc是ext3驱动程序的本地驱动程序,位于fs / ext3。你不能在驱动程序代码之外调用它。