#c #linker #arm
#c #компоновщик #arm
Вопрос:
Я хочу использовать систему «initcall» на процессоре ARM в C.
Я определяю эти макросы: typedef int (*payload_initcall_t)(payload_state_t *состояние); extern payload_initcall_t __полезная нагрузка_инициализация_start, __полезная нагрузка_инициализация_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 = amp;__payload_initcall_start;
do {
payload_log(LOG_DEBUG, "payload init fct call: %p", (void *)call_p);
(*call_p)(state);
call_p;
} while (call_p < amp;__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) (состояние)». Когда я запускаю objdump в двоичном файле x86_64, я нахожу «code_segment» и «payload_init_ptrs», но в двоичном файле ARM я не могу найти эти разделы. Мой GCC устарел?
Заранее спасибо.
Комментарии:
1.Разве это не должно быть
while
циклом, а неdo
while
циклом?2. Упс. да, спасибо. Это ошибка. Это решает ошибку segfault, но не мою проблему.
3. Может быть, статический материал был оптимизирован? Возможно, вам придется
__attribute__((used))
их сохранить.4. ДА! Это работает! Спасибо