c - 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 过时了吗?
提前致谢。
解决方案
推荐阅读
- swift - 内容预览器未在 Xcode 12.5.1 上加载
- css - 有没有办法在包装类中包含 bootstrap-vue,这样它就不会与页面上的其他引导库冲突?
- python-3.x - 带有两个循环的异步,最佳实践
- c# - 根据两个 JSON 字符串之间的比较从 JSON 字符串中删除元素 - C#
- javascript - 如何在 postgres 中创建用户以连接到 nodejs?
- javascript - 如何在 Woocommerce 结帐页面上禁用非洲国家/地区的邮政编码
- node.js - axios multipart/form-data 请求返回为“request is not well-formed multipart/form-data”
- android - 在 Android 应用程序中,我正在从 URL 打开视频,但无法打开视频错误正在显示,但放置在原始资产中时打开相同的视频
- aurelia - 如何在 aurelia slickgrid/slickgrid 中的 cloumn 值旁边显示图标?
- ios - Sentry iOS dSYM:无法处理本机堆栈跟踪