Wie löst der Compiler / Linker eine Kernel-API wie 'printk' auf, die von einem Linux-Modul aufgerufen wird?

Ich habe ein Beispiel für ein hallo.ko-Kernelmodul geschrieben:

#include <linux/module.h>      /* Needed by all modules */
#include <linux/kernel.h>      /* Needed for KERN_INFO */

int init_module(void)
{
        printk(KERN_INFO "Hello world.\n");
        return 0;
}

void cleanup_module(void)
{
        printk(KERN_INFO "Goodbye world 1.\n");
}

Hier habe ich die "printk" -Methode verwendet, bei der es sich um eine Kernel-API handelt, die von Linux bereitgestellt wird. Ich kann die exportierten Linux-Symbole in "/ proc / kallsyms" sehen. Ich bin gespannt, wie gcc / ld die aufgerufenen Kernel-APIs verknüpft. Erhält gcc / ld die Adresse der Kernelmethode aus "/ proc / kallsyms" oder einer anderen Datei und führt eine Verknüpfung durch? Wenn ja, wie kann gcc / ld das erfahren? Ich konnte keine Option, die das sagt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage