Linux内核实用程序函数,它将符号字符串作为输入并返回其地址

时间:2014-02-21 11:29:42

标签: linux kernel

linux中是否有API可以为我提供作为字符串输入传入的符号的地址? 例如,在下面的函数中,我需要输出与& begin1。

的打印相同的输出

我以编程方式需要这个的原因是我的程序中有begin1,begin2,begin3等标签......我必须运行一个循环来获取它们的地址。

extern void * begin1; int main(int argc,char ** argv) {     char buf1 [30],buf2 [30];

int i= 1;
asm volatile ("nop;\n"
       "nop;\n"
       "begin1:\n"
       "nop;\n"
       "nop;\n"
       "nop;\n"
       "nop;\n"
       "nop;\n"
       "nop;\n"
       "lbl1:\n"
       "nop;\n"
       "nop;\n"
       );


printf("&begin1 = %p\n", &begin1); //NEED THIS OUTPUT

sprintf(buf1, "begin%d",i);
sprintf(buf2,"lbl%d",i);

//Q: Can we pass buf1 as input to a kernel function that can give me the same output as above? 

return 0;

}

1 个答案:

答案 0 :(得分:1)

具有main功能的程序不能是内核代码。它是由execve(2) -e.g开始的应用程序代码。你的贝壳 - (和应用程序通过syscalls ...)

中列出的syscalls(2)与内核进行交互

在Linux上,您的内核代码通常是某个自定义驱动程序的内核模块。

您可以使用dlopen(3)dlsym(并且您需要符号是全局的,因此在汇编程序中使用.global指令)。然后,您希望将程序与-rdynamic标志(和-ldl库)链接,使用NULL路径调用dlopen,并在该程序句柄上使用dlsym

请注意,dlopen不是系统调用(它使用openmmap ...)

BTW,您可能会对GCC label as values扩展感兴趣。