是否可以在没有链接器脚本的情况下获得特定(自定义)部分的大小?
我想把函数指针放在这一部分。它用于裸机应用程序。希望实现最小模块(驱动程序)支持。我的目标是在这个模块中调用一些初始化代码。截面尺寸应该是可变的。取决于实现的模块。有了section的大小和单个函数指针的大小,我可以计算需要加载的模块的数量。
我编写了下面的宏,它将函数指针放置在一个特定的节中:
linker.h:
#define _ADD_FUNC_PTR(_section, _func)
int (*fp_ ## _func)(void)
__attribute__((section(#_section)))
= _func ;
module.c:
#include <stdio.h>
#include "linker.h"
int bar_init(void)
{
printf("barn");
}
_ADD_FUNC_PTR(.modules, bar_init)
我目前的方法是通过链接器脚本和汇编代码获得这一节的大小。下面是一些小片段:
从链接器脚本中提取:
.modules : {
. = ALIGN(4K);
_modules_s = .;
*(.modules)
_modules_e = .;
} > RAM_KERN
我在C中调用的简单汇编函数(这里是AArch64):
FUNCTION(asm_modules_start)
ldr x0, =_modules_s
ret
FUNCTION(asm_modules_end)
ldr x0, =_modules_e
ret
有了这两个函数,我可以计算我可以加载的模块的数量。但我的问题是:没有装配,这也可能吗?
是的,不需要汇编器也可以做到。
你需要将这些符号声明为外部的:
typedef int (*function_pointer)(void);
extern function_pointer* modules_s;
extern function_pointer* modules_e;
size_t number_of_functions = modules_e - modules_s;
这是有效的,因为两个指针都来自同一个数组。
根据您的编译器系统,您可能需要或不需要删除前导下划线。