首页 > 解决方案 > 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

通过这两个函数,我可以计算出可以加载的模块数量。但我的问题是:不组装也可以吗?

标签: cgcc

解决方案


是的,你可以在没有汇编程序的情况下做到这一点。

您需要将符号声明为外部:

typedef int (*function_pointer)(void);

extern function_pointer* modules_s;
extern function_pointer* modules_e;

size_t number_of_functions = modules_e - modules_s;

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

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


推荐阅读