C语言 GCC -在没有链接器脚本的情况下获取自定义节的大小



是否可以在没有链接器脚本的情况下获得特定(自定义)部分的大小?

我想把函数指针放在这一部分。它用于裸机应用程序。希望实现最小模块(驱动程序)支持。我的目标是在这个模块中调用一些初始化代码。截面尺寸应该是可变的。取决于实现的模块。有了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;

这是有效的,因为两个指针都来自同一个数组。

根据您的编译器系统,您可能需要或不需要删除前导下划线。

相关内容

最新更新