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

标签 linux kernel

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

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

外部无效*begin1; int main(int argc, char **argv) { 字符 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;

}

最佳答案

具有main函数的程序不能是内核代码。它是由 execve(2) 启动的应用程序代码-例如。通过你的外壳- (应用程序通过 syscalls 中列出的 syscalls(2) ... 与内核交互)

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

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

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

顺便说一句,您可能对 GCC label as values 感兴趣扩展名。

关于Linux 内核实用函数,以符号字符串作为输入并返回其地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21933218/

相关文章:

linux - 使用 Python 确定可用于更新的 firefox 版本

字符设备捕获多个 (int) ioctl 参数

linux - 定义多个 struct machine_desc 结构

windows - 内核内存地址空间

kernel - 构建核心图像最小图像时如何运行Yocto的ksize.py工具?

linux - 需要更少的笨蛋 shell

linux - apt-get 安装失败且无法正常工作

c - Linux 中 PTR_ALIGN 的用法

android - Linux perf stat 工具返回零指令计数。我在这里错过了什么?

c - 为什么 ls 的这些指令数相差如此之大? (ptrace 对比 perf 对比 qemu)