2013-07-12 16 views
5

Quando costruisco il kernel Linux, vengono generate due immagini vmlinux e vmlinux.o. Entrambi sembrano differire per dimensioni (113KB e 198KB rispettivamente ...). Qualcuno potrebbe dare un'idea delle differenze?Differenza tra vmlinux e vmlinux.o

Grazie,

Vj

+1

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 –

+0

Se ciò dovesse essere vero (vmlinux.o essendo un input per vmlinux), perché la dimensione di vmlinux è minore di vmlinux.o? : -/ – TheLoneJoker

+0

Penso che qualcosa sia stato rimosso da vmlinux.o dopo essere stato collegato a vmlinux. –

risposta

4

Le immagini producono nel corso di una Linux costruire variare da architettura e di destinazione. Vi sono molti obiettivi di costruzione intermedi oltre a quelli menzionati nella domanda. La maggior parte non sono interessanti se non per scopi accademici. Sfortunatamente, c'è più di un bersaglio chiamato vmlinux. vmlinux.o non è molto interessante. Nell'albero Linux di livello superiore, troverai un file ELF chiamato vmlinux. Executing

$ file vmlinux 

dovrebbe confermare che questo è il file ELF. Non conosco alcun sistema che avvii direttamente questo file. L'unica volta che questo file è interessante è per il debug, perché contiene i simboli di debug che può essere letto da un debugger. L'obiettivo di avvio effettivo verrà trovato in una sottodirectory a seconda dell'architettura. Per x86, (pensavo che non fosse la mia esperienza) penso che troverai un obiettivo chiamato bzImage. Per le architetture ARM, alcuni sistemi eseguono l'avvio di zImage, altri di uImage (che è un'immagine del kernel Linux inserita in un'intestazione riconosciuta dal bootloader U-Boot. Anche se si rimuove l'intestazione U-Boot, l'immagine è un'immagine composita. , non è un file ELF, e non è un puro .o, ecc. È una concatenazione di diversi blob binari, che possono includere informazioni sulla configurazione del kernel, il kernel stesso, quasi sempre compresso e spesso un pezzo di codice eseguibile (es. .png non compresso) che chiamo un caricatore "bootstrap", che spesso contiene routine di inizializzazione specifiche della macchina e della scheda. Ho meno familiarità con x86, ma anche su quell'architettura, l'immagine di avvio del kernel (quella che si avvia) è un'immagine composita contenente diversi componenti, ad esempio non un file puro .o o ELF

Un buon modo per vedere cosa sta accadendo è compilare il kernel con modalità dettagliata, quindi tch i passaggi finali per vedere come vengono manipolate le immagini. Aggiungi V = 1 alla riga di comando 'make' per attivare la modalità dettagliata.

Happy hacking!

+1

Grazie challinan ... ma ancora non ho capito come vmlinux.o forma diversa vmlinux ... :( – TheLoneJoker

0

Provare quanto segue per scoprire cosa sono.
file di vmlinux
file di vmlinux.o

Controllare il file make per scoprire come si prepara vmlinux. Questo farà un po 'di luce.
Non è necessario che se vmlinux.o viene utilizzato per preparare vmlinux, la dimensione del vmlinux deve essere maggiore di vmlinux.o

1

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