Ich bin ein Anfänger C- und Linux-Entwickler, also tut es mir leid, wenn das klingt verwirrend.Verwenden von Kernel-Modul-Funktionen in einem benutzerdefinierten Systemaufruf - Undefinierter Referenzfehler
ich es geschafft, ein sehr einfaches System Aufruf durch die Aktualisierung der syscall_64.tbl erfolgreich zu erstellen, asmlinkage Methodendefinition Hinzufügen des Ordners Haupt Make-Datei syscalls.h, Hinzufügen und eine Make-Datei zu schaffen, die nur eine Zeile hat:
obj-y := syscall.o
Keine Probleme bis dahin, ich kompilierte Linux-Quellcode und es funktionierte. Ich möchte einen fortgeschritteneren Systemaufruf erstellen. So habe ich eine Funktion vmx.c (die im Bogen ist/x86/kvm):
void myFunction(void){
//Some code
}
EXPORT_SYMBOL(myFunction);
und definiert es in vmx.h (Es ist in arch/x86/include/asm):
void myFunction(void);
Jetzt beginnt das Problem. Ich habe vmx.h in meine Datei syscall.c aufgenommen und diese Funktion aufgerufen. Ich bekomme einen "undefinierten Verweis auf myFunction", wenn ich versuche, Linux-Quellcode zu kompilieren. Was mache ich falsch? Das ist mein syscall.c ist:
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <asm/vmx.h>
asmlinkage long sys_customsyscall(const char *test)
{
printk(KERN_ALERT "Test: %s,\n", test);
myFunction();
return 0;
}
vielleicht #include "asm/vmx.h" –
Kannst du deine 'syscall.c'-Kompilierung in der make-Ausgabe sehen? Kannst du deine Frage bearbeiten, um zu zeigen, in welches "Makefile" des Superfolders du dein Verzeichnis aufgenommen hast und wie? Sie haben ein gutes, illustratives Beispiel dafür erstellt, wie Sie dem Linux-Kernel etwas hinzufügen können, und deshalb habe ich Sie aufgestuft, aber um Ihr Problem zu lösen, ist es besser, alle Daten im Blick zu haben. Es ist nicht notwendig, das Makefile des gesamten Superfolders, nur den Verzeichnisnamen und die Include-Zeile mit zwei oder drei Kontextlinien einzubeziehen. –