首页 > 解决方案 > ARM 上的 initcall 链接器

问题描述

我想在 C 语言的 ARM CPU 上使用“initcall”系统。

我定义了这些宏: typedef int (*payload_initcall_t)(payload_state_t *state); extern payload_initcall_t __payload_initcall_start, __payload_initcall_end;

#define __payload_initcall(fn) \
        static payload_initcall_t __payload_initcall_##fn __payload_init_call = fn
#define __payload_init_call     __attribute__ ((unused,__section__ (".payload_init_ptrs")))
#define payload_init(x)  __payload_initcall(x);

#define __init __attribute__ ((__section__ (".code_segment")))

模块示例:

static int __init inspec_init(payload_state_t *state) {

    payload_log(LOG_INFO, "I AM THE PAYLOAD 1 !!");

    return 0;
}

payload_init(inspec_init)

调用模块的函数:

payload_initcall_t *call_p;

        call_p = &__payload_initcall_start;
        do {
                payload_log(LOG_DEBUG, "payload init fct call: %p", (void *)call_p);
                (*call_p)(state);
                ++call_p;
        } while (call_p < &__payload_initcall_end);

在链接器文件中(就在 .text 部分之后:

  __payload_initcall_start = .;
  payload_init_ptrs : { *(.payload_init_ptrs) }
  __payload_initcall_end   = .;
  code_segment    : { *(.code_segment) }

在我的 x86_64 计算机上它可以工作。

我使用 buildroot 工具链 (GCC 7.4.0) 交叉编译此代码。编译终止时没有错误,但是当我在 ARM 目标上运行二进制文件时,它在“(* call_p)(状态)”行出现段错误。当我在 x86_64 二进制文件上运行 objdump 时,我找到了“code_segment”和“payload_init_ptrs”,但在 ARM 二进制文件中我找不到这些部分。我的 GCC 过时了吗?

提前致谢。

标签: clinkerarm

解决方案


推荐阅读