2013-07-12 7 views
5

Kiedy buduję jądro Linux, generowane są dwa obrazy: vmlinux i vmlinux.o. Oba wydają się różnić także pod względem wielkości (odpowiednio 113KB i 198KB ...). Czy ktoś może wgląd w różnice?Różnica między vmlinux i vmlinux.o

Dzięki,

Vj

+1

Patrząc na Makefile na najwyższym poziomie i na wyjściu z kompilacji wydaje się, że vmlinux.o jest wejściem do vmlinux. vmlinux jest tworzony poprzez połączenie vmlinux-init, -main, .o i kallsyms.o. Oto odpowiednia linia z pliku Makefile: vmlinux: $ (vmlinux-lds) $ (vmlinux-init) $ (vmlinux-main) vmlinux.o $ (kallsyms.o) FORCE –

+0

Jeśli to ma być prawda (vmlinux.o będąc wejściem dla vmlinux), dlaczego rozmiar vmlinux jest mniejszy niż vmlinux.o? : -/ – TheLoneJoker

+0

Myślę, że coś zostało usunięte z vmlinux.o po połączeniu z vmlinux. –

Odpowiedz

4

ilustracje produkować podczas Linux budować zależy od architektury i celu. Istnieje wiele pośrednich celów budowy oprócz tych wymienionych w pytaniu. Większość z nich jest mało interesująca, z wyjątkiem prawdopodobnie celów akademickich. Niestety istnieje więcej niż jeden cel o nazwie vmlinux. vmlinux.o nie jest zbyt interesujący. Na najwyższym drzewie Linuksa znajdziesz plik ELF o nazwie vmlinux. Wykonywanie

powinno potwierdzić, że jest to plik ELF. Nie znam żadnych systemów, które uruchamiają ten plik bezpośrednio. Ten plik jest interesujący tylko dla debugowania, ponieważ zawiera symbole debugowania, które może odczytać debugger. Rzeczywisty cel bootowania zostanie znaleziony w podkatalogu w zależności od architektury. Dla x86 (myślę, że to nie moja wiedza), myślę, że znajdziesz cel o nazwie bzImage. W architekturach ARM niektóre systemy uruchamiają zImage, inne uruchamiają uImage (który jest obrazem jądra systemu Linux umieszczonym w nagłówku rozpoznanym przez bootloader U-Boot.) Nawet jeśli usuniesz nagłówek U-Boot, obraz jest złożonym obrazem. , nie jest to plik ELF i nie jest czystym .o, itp. Jest to połączenie kilku binarnych obiektów typu blob, które mogą zawierać informacje o konfiguracji jądra, samo jądro, prawie zawsze skompresowane, a często fragment działającego kodu (np. nieskompresowany), który nazywam programem ładującym "bootstrap", który często zawiera procedury inicjowania specyficzne dla komputera i płyty.Jestem mniej znany z x86, ale nawet w tej architekturze obraz rozruchowy jądra (ten, który uruchamiasz) jest obraz złożony zawierający kilka składników, tj. nie jest czystym plikiem .o lub ELF.

Dobrym sposobem sprawdzenia, co się dzieje, jest skompilowanie jądra w trybie pełnym, a następnie ostatnie kroki, aby zobaczyć, jak manipulowane są obrazy. Dodaj V = 1 do linii poleceń 'make', aby włączyć tryb "verbose".

Happy hacking!

+1

Dzięki challinan ... ale nadal nie rozumiem, jak vmlinux.o inna forma vmlinux ... :( – TheLoneJoker

0

Wykonaj następujące czynności, aby dowiedzieć się, jakie one są.
plik vmlinux
plik vmlinux.o

sprawdzić plik make, aby dowiedzieć się, jak vmlinux jest przygotowany. To rzuci trochę światła.
To nie jest konieczne, jeśli vmlinux.o służy do przygotowania pliku vmlinux wielkość vmlinux musi być większa niż vmlinux.o

1

Kiedy jądro Linux to budować, dwa obrazy są generowane vmlinux oraz vmlinux.o.

vmlinux.o: Czy relocatable plik obiektowy

pliku vmlinux: Czy plik wykonywalny

Linker trwa relocatable pliki obiektów i argumenty wiersza polecenia w celu wygenerowania pliku wykonywalnego obiektu. Aby utworzyć plik wykonywalny, Linker musi wykonać rozdzielczość symbolu i Relocation.

Wykonaj polecenia "file" i "readelf" na vmlinux.o i vmlinux, aby uzyskać więcej informacji.

korzeń @ beaglebone/home # plik vmlinux

vmlinux Elf 32-bitowy LSB wykonywalny, ramię, wersja 1 (SYSV) łączony statycznie BuildID [sha1] = 0xdfd102a3c2b79fcc2f1949323dc54b9371c75608, pozbawione

root @ beaglebone:/home #

root @ beaglebone:/# plik do domu vmlinux.o

vmlinux.o: ELF 32-bitowym LSB nierelokacyjnego, ramię, wersja 1 (SYSV), pozbawione