c - GCC - 在没有链接描述文件的情况下获取自定义部分的大小
问题描述
是否可以在没有链接描述文件的情况下获得特定(自定义)部分的大小?
我想在本节中放置函数指针。它适用于裸机应用程序。想要实现最小的模块(驱动程序)支持。我的目标是在这个模块中调用某种初始化代码。部分大小应该是可变的。取决于实现的模块。通过节的大小和单个函数指针的大小,我可以计算出需要加载的模块数。
我编写了以下宏,它将函数指针放在特定部分:
链接器.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("bar\n");
}
_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;
这是可行的,因为两个指针都来自同一个数组。
根据您的编译器系统,您可能需要删除前导下划线,也可能不需要。
推荐阅读
- python - UnicodeDecodeError just by importing Pandas
- javascript - How to make videos play automatically from many videos using dynamic dom arrays?
- android - 获取所有类型的账户 Android API 29
- r - Reading from CSV file in R and formatting dates and times with strptime()
- excel - 过滤表中具有多个范围的 SUMIF 公式
- java - Does Gson’s fromJSON have a parsing limit on the string parameter?
- r - 使用 2 个不同大小的数据帧 R 的子集
- sockets - TServerSocket:如何在发送消息之前检查 ListView 上的特定客户端是否仍然连接?
- angular6 - How to show/hide the agm circle when user clicks on each marker pin - Angular 8
- r - R function writing - getting error: NaNs producedError in tsort[U + 1]only 0's may be mixed with negative subscripts