Puncte:0

Kernel make generează „ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0): ​​referință nedefinită la `__x64_sys_s_enable’”

drapel hu

Sistemul de operare este Ubuntu 20.10 Sursa kernelului este linux_5.8.0-59.66

Port modificările kernelului de la Centos 7 Rhel 7.9 la Ubuntu.

Sursa originală a nucleului Ubuntu, nemodificată, compilează și rulează curat pe această mașină. Configurarea compilatorului pare să funcționeze corect.

Problema mea actuală este legată de un apel de sistem pe care l-am adăugat. Eroarea generată este -

LD .tmp_vmlinux.btf
ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc0): ​​referință nedefinită la `__x64_sys_s_enable'
BTF .btf.vmlinux.bin.o    
Anomalie de segmentare (core-dumping)
LD .tmp_vmlinux.kallsyms1
.btf.vmlinux.bin.o: fișierul nu este recunoscut: formatul fișierului nu este recunoscut
make: *** [Makefile:1163: vmlinux] Eroare 1

Am căutat și am căutat pe google această eroare originală „referință nedefinită”, am găsit posibile remedieri care nu au funcționat.

Iată pașii pe care i-am folosit pentru a adăuga apelul de sistem, care a funcționat inițial pe Centos 7 și RHEL 7.9.

S-a modificat /SOURCE-DIRECTORY/include/linux/syscalls.h comentând linia originală și adăugând referința la __64 (inclusiv o linie goală deasupra acesteia)-

asmlinkage long __64_sys_s_enable(int s_enable_flag);
//asmlinkage long sys_s_enable(int s_enable_flag);

Modificat /SOURCE-DIRECTORY/arch/x86/include/asm/syscalls.h adăugând -

# ADIȚIONARE SYSCALL
440 64 s_enable sys_s_enable

Câmpurile sunt delimitate de TAB și nu am adăugat niciun rând necompletat.

Am creat directorul sursă și fișierele - /SOURCE-DIRECTORY/s_enable care conține s_enable.c. s_enable.c în întregime este

#include <linux/kernel.h>
extern int s_enable_flag;

asmlinkage long sys_s_enable(int i)
{
// printk(KERN_INFO "În ORIGINAL SYSCALL s_enable\n");
         s_enable_flag = i;
         întoarce 0;
}

Și a adăugat directorul syscall corespunzător la Makefile.

core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ s_enable/

Și a alergat „sudo make”.

Nu sunt sigur cu ce aș putea face greșit, deoarece „make” funcționează cu sursa originală a nucleului, iar apelul de sistem pe care încerc să îl adaug a funcționat pe celelalte distribuții menționate.

Vă mulțumim pentru orice contribuție pe care o puteți oferi.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.