gpt4 book ai didi

c - 实现类似Linux内核的module_init,但是在ld脚本中遇到了一些麻烦

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:32 29 4
gpt4 key购买 nike

我非常喜欢 linux 内核的 module_init 功能,我想为我的用户空间应用程序实现相同的功能。

我尝试修改链接器脚本来执行此操作:

1、复制一个x86-64标准的ld脚本

2、添加我的自定义栏目

  .module.init         :
{
PROVIDE_HIDDEN (__module_init_start = .);
*(.module_init*)
PROVIDE_HIDDEN (__module_init_end = .);
}

3、将init函数指针放入moudle_init段

#define app_module_init(x) __initcall(x);
#define __initcall(fn) \
static initcall_t __initcall_##fn \
__attribute__ ((__section__(".module_init"))) = fn

app_module_init(unit_test_1_init);
app_module_init(unit_test_2_init);
app_module_init(unit_test_3_init);
app_module_init(unit_test_4_init);

4、使用自定义链接描述文件(基于标准链接描述文件)编译应用

gcc  -o "./module_init" -T module.lds ./module_init.o

5、然后我objdump了moudle_init,我发现section生成了:

Disassembly of section .module_init:

0000000000a01080 <__initcall_unit_test_1_init>:
a01080: ad lods %ds:(%rsi),%eax
a01081: 05 40 00 00 00 add $0x40,%eax
...

0000000000a01088 <__initcall_unit_test_2_init>:
a01088: c2 05 40 retq $0x4005
a0108b: 00 00 add %al,(%rax)
a0108d: 00 00 add %al,(%rax)
...

0000000000a01090 <__initcall_unit_test_3_init>:
a01090: d7 xlat %ds:(%rbx)
a01091: 05 40 00 00 00 add $0x40,%eax
...

0000000000a01098 <__initcall_unit_test_4_init>:
a01098: ec in (%dx),%al
a01099: 05 40 00 00 00 add $0x40,%eax

但是 __module_init_start 和 __module_init_end 变量不是我期望的值。在我的例子中,__module_init_start 是 0x4005ad,__module_init_end 是 0x400000003。这很奇怪,因为 0x4005ad 是 __initcall_unit_test_1_init 的地址。

谁能告诉我如何让这个用户空间 module_init 工作?

最佳答案

链接描述文件只能设置变量的地址。使用 &__module_init_start 获取指向该部分开头的指针,使用 &__module_init_end 获取指向结尾的指针。

关于c - 实现类似Linux内核的module_init,但是在ld脚本中遇到了一些麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34410393/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com