компоновщик initcall на ARM

#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. ДА! Это работает! Спасибо