Quando il kernel Linux è costruire, due immagini vengono generate vmlinux e vmlinux.o.
vmlinux.o: è il file oggetto rilocabile
vmlinux: è il file eseguibile
Linker prende i file oggetto riallocabili e gli argomenti della riga di comando per generare un file oggetto eseguibile. Per produrre un file eseguibile, il Linker deve eseguire la risoluzione dei simboli e la rilocazione.
Eseguire il comando "file" e "readelf" su vmlinux.o e vmlinux per ulteriori informazioni.
root @ BeagleBone:/home # file di vmlinux
vmlinux: ELF a 32 bit LSB eseguibile, ARM, versione 1 (SYSV), staticamente legata, BUILDID [SHA1] = 0xdfd102a3c2b79fcc2f1949323dc54b9371c75608, non spogliato
root @ BeagleBone:/home #
root @ BeagleBone:/home # file di vmlinux.o
vmlinux.o: ELF a 32 bit LSB relocatable, ARM, versione 1 (SYSV), non scortecciato
Osservando il makefile di livello superiore e l'output di build sembra che vmlinux.o sia un input per vmlinux. vmlinux è creato dal collegamento di vmlinux-init, -main, .o e kallsyms.o. Ecco una riga pertinente dal Makefile: vmlinux: $ (vmlinux-lds) $ (vmlinux-init) $ (vmlinux-main) vmlinux.o $ (kallsyms.o) FORCE –
Se ciò dovesse essere vero (vmlinux.o essendo un input per vmlinux), perché la dimensione di vmlinux è minore di vmlinux.o? : -/ – TheLoneJoker
Penso che qualcosa sia stato rimosso da vmlinux.o dopo essere stato collegato a vmlinux. –