Любая идея, как Linux определяет, какая строка должна быть напечатана в модуле ядра? - PullRequest
1 голос
/ 06 марта 2020

С учетом самого базового c модуля ядра

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/printk.h>

static int __init my_mod_init(void) {
    printk("Hello World!");
    printk("Goodbye World!");
    return 0;
}
static void __exit my_mod_exit(void) { }

module_init(my_mod_init);
module_exit(my_mod_exit);

MODULE_LICENSE("GPL");

G CC создает следующую сборку armv7 (objdump)

dummy.ko:     file format elf32-littlearm

Disassembly of section .init.text:

00000000 <init_module>:
   0:   e92d4010    push    {r4, lr}
   4:   e3000000    movw    r0, #0
   8:   e3400000    movt    r0, #0
   c:   ebfffffe    bl  0 <printk>
  10:   e3000000    movw    r0, #0
  14:   e3400000    movt    r0, #0
  18:   ebfffffe    bl  0 <printk>
  1c:   e3a00000    mov r0, #0
  20:   e8bd8010    pop {r4, pc}

Disassembly of section .exit.text:

00000000 <cleanup_module>:
   0:   e12fff1e    bx  lr

Секция rodata выглядит следующим образом:

Contents of section .rodata.str1.4:
 0000 48656c6c 6f20576f 726c6421 00000000  Hello World!....
 0010 476f6f64 62796520 576f726c 642100    Goodbye World!. 

Я по крайней мере ожидал, что r0 в строках 0x10 и 0x14 будет что-то вроде mov r0, #16 или ldr r0, [pc, #12]. Как вторая printk функция сообщает для печати "Прощай, мир!" ?

1 Ответ

4 голосов
/ 06 марта 2020

A .ko, по-видимому, похоже на .o - перемещаемый объектный файл, а не исполняемый файл ELF или общий объект.

Таким образом, в машинном коде есть только заполнители с фактическим адресом, заполненным только во время загрузки на основе информации о перемещении.

Разберите с помощью objdump -dr, чтобы отобразить перемещения с именами символов. (Или objdump -drWC) , так же, как при разборке .o.

...