我正在尝试插入linux内核代码,以便在BitCast
指令之后的每个函数中插入一个函数调用。
因此,我将C代码修改为#include <linux/my_header.h>
,在那里我有打印机功能。
页眉看起来像这样。
#ifndef __header_ID
#define __header_ID
static inline void print_typecast(...){
printk(...);
}
#endif
然后我使用Xclang加载我的FunctionPass,它看起来像这样。
// M is of type llvm::Module*
Function* f = M->getFunction("print_typecast");
if (f == nullptr) {
errs() << "Function not found in the modulen";
}
else {
// insert function in the code
}
然而,我的通行证从未在模块中找到函数。当我删除static
时,它会找到函数,但在最后的编译步骤中,链接器会抱怨定义重复。
任何人都知道如何制作LLVM";参见";静态导入/包含的函数?
编辑:我也走到了极致,在内核代码的每个c文件中都直接写入了相同的函数(#include <linux/kernel.h>
(
static
意味着对该函数的所有调用对这个编译程序现在都是可见的,并且意味着如果编译器没有看到这样的调用,那么它可以跳过编译该函数的任何输出,因为作为程序员,你已经承诺没有人会想要它。