GCC - 在没有链接描述文件的情况下获取自定义部分的大小
Posted
技术标签:
【中文标题】GCC - 在没有链接描述文件的情况下获取自定义部分的大小【英文标题】:GCC - Get the size of custom section without linker script 【发布时间】:2021-01-30 14:31:30 【问题描述】:是否可以在没有链接描述文件的情况下获取特定(自定义)部分的大小?
我想在这个部分放置函数指针。它适用于裸机应用程序。想要实现最小的模块(驱动程序)支持。我的目标是在这个模块中调用某种初始化代码。部分大小应该是可变的。取决于实现的模块。通过节的大小和单个函数指针的大小,我可以计算出需要加载的模块数。
我写了下面的宏,它把函数指针放在一个特定的部分:
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("bar\n");
_ADD_FUNC_PTR(.modules, bar_init)
我目前的方法是通过链接描述文件和汇编代码来获取此部分的大小。这里小sn-ps:
从我的链接器脚本中提取:
.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
通过这两个函数,我可以计算可以加载的模块数量。但我的问题是:不组装也可以吗?
【问题讨论】:
这是特定于实现的。但是,我倾向于猜测您需要使用链接器脚本,因为(我希望)首先确定节大小的是链接器。 你当然不需要这个程序集。您可以简单地执行extern char _modules_s[];
(或者可能没有前导下划线,具体取决于您的平台上符号命名的工作方式),然后在您的C 代码中使用_modules_s
作为指针。但我同意@JohnBollinger 的观点,即我不明白如果没有链接器脚本你怎么办。
【参考方案1】:
是的,你可以在没有汇编程序的情况下做到这一点。
您需要将符号声明为外部:
typedef int (*function_pointer)(void);
extern function_pointer* modules_s;
extern function_pointer* modules_e;
size_t number_of_functions = modules_e - modules_s;
这行得通,因为两个指针都来自同一个数组。
根据您的编译器系统,您可能需要删除前导下划线。
【讨论】:
以上是关于GCC - 在没有链接描述文件的情况下获取自定义部分的大小的主要内容,如果未能解决你的问题,请参考以下文章
LLINUX GCC 编译C使用自定义动态链接库.so的问题