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 - 在没有链接描述文件的情况下获取自定义部分的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在命令行中使 gcc 链接器输出节大小?

如何在没有crt的情况下链接obj文件?

LLINUX GCC 编译C使用自定义动态链接库.so的问题

如何在没有表单的情况下获取文件上传

使用 gcc/g++ 使 C++ 程序在没有窗口的情况下运行? [复制]

如何让linux-gcc找到自定义的头文件