Derleme ve Çapraz Derleme
Konfigürasyon süreci tamamlandıktan ve herhangi bir yolla .config
dosyası kernel kaynak kodlarının bulunduğu ana dizinde oluşturulduktan sonra derleme aşamasına geçilir.
Derleme işlemi sonucunda işlemin yapıldığı sistem için çalışacak native kernel imajı elde edilebileceği gibi, çapraz derleme (cross-compiling) metoduyla farklı bir mimari için imaj üretimi de sağlanabilir.
Normal derleme işlemi için make
komutunu vermeniz yeterlidir. Öncelikle ana dizinde yer alan Makefile
dosyası okunacak ve .config
dosyasında yapılan seçimler export edilerek derleme sürecinin ilerleyen aşamalarında kullanılabilir olması sağlanacaktır.
Kernel imajı sıkıştırılmadığında biraz büyükçe olduğundan her zaman sıkıştırılmış formda kullanılır. Bunun için kernel imajı içerisinde kendi kendini decompress edebilecek bir rutin eklenir ve kernel imajı sıkıştırılmış haliyle kullanılır.
Bu süreci otomatik hale getirmek için PC mimarisi için yapılan derlemeler için bzImage
hedefi kullanılmaktadır:
$ make bzImage
Komut işletilirken build işleminin çıktıları aşağıdaki gibi olacaktır:
...
CC arch/arm/kernel/topology.o
CC arch/arm/kernel/io.o
AS arch/arm/kernel/debug.o
CC arch/arm/kernel/early_printk.o
LD arch/arm/kernel/built-in.o
AS arch/arm/kernel/head.o
LDS arch/arm/kernel/vmlinux.lds
...
Bu özet çıktı yerine çalıştırılan derleyici, linker vb. tüm aldığı parametreleri görmek isterseniz, make
komutunun sonuna V=1
parametresini ekleyebilirsiniz (verbosity):
$ make bzImage V=1
...
gcc -Wp,-MD,arch/x86/crypto/.aes-x86_64-asm_64.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/4.9/include
-I./arch/x86/include -Iarch/x86/include/generated/uapi -Iarch/x86/include/generated
-Iinclude -I./arch/x86/include/uapi -Iarch/x86/include/generated/uapi
-I./include/uapi -Iinclude/generated/uapi -include ./include/linux/kconfig.h
-D__KERNEL__ -D__ASSEMBLY__ -m64 -DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1
-DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1
-DCONFIG_AS_CRC32=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -Wa,-gdwarf-2 -mfentry
-DCC_USING_FENTRY -DMODULE -c -o arch/x86/crypto/aes-x86_64-asm_64.o
arch/x86/crypto/aes-x86_64-asm_64.S
...
Derleme işlemi bittiğinde bzImage
dosyası oluşur. Bu dosya vmlinux
kernel imajının sıkıştırılmış halini ve decompress rutinini içerir.
Derleme işlemi çıktısının son bölümü aşağıdaki gibi bir çıktı üretecektir:
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
LD init/built-in.o
KSYM .tmp_kallsyms1.o
KSYM .tmp_kallsyms2.o
LD vmlinux
SORTEX vmlinux
SYSMAP System.map
CC arch/x86/boot/a20.o
AS arch/x86/boot/bioscall.o
CC arch/x86/boot/cmdline.o
AS arch/x86/boot/copy.o
HOSTCC arch/x86/boot/mkcpustr
CC arch/x86/boot/cpuflags.o
CC arch/x86/boot/cpucheck.o
CC arch/x86/boot/early_serial_console.o
CC arch/x86/boot/edd.o
VOFFSET arch/x86/boot/voffset.h
CC arch/x86/boot/main.o
CC arch/x86/boot/mca.o
LDS arch/x86/boot/compressed/vmlinux.lds
AS arch/x86/boot/compressed/head_64.o
CC arch/x86/boot/compressed/misc.o
CC arch/x86/boot/memory.o
CC arch/x86/boot/compressed/string.o
CC arch/x86/boot/compressed/cmdline.o
OBJCOPY arch/x86/boot/compressed/vmlinux.bin
HOSTCC arch/x86/boot/compressed/mkpiggy
CC arch/x86/boot/compressed/cpuflags.o
CC arch/x86/boot/compressed/early_serial_console.o
CC arch/x86/boot/pm.o
AS arch/x86/boot/pmjump.o
CC arch/x86/boot/printf.o
CC arch/x86/boot/compressed/eboot.o
AS arch/x86/boot/compressed/efi_stub_64.o
CC arch/x86/boot/regs.o
CC arch/x86/boot/string.o
CC arch/x86/boot/tty.o
CC arch/x86/boot/video.o
CC arch/x86/boot/video-mode.o
CC arch/x86/boot/version.o
CC arch/x86/boot/video-vga.o
XZKERN arch/x86/boot/compressed/vmlinux.bin.xz
CC arch/x86/boot/video-vesa.o
CC arch/x86/boot/video-bios.o
HOSTCC arch/x86/boot/tools/build
CPUSTR arch/x86/boot/cpustr.h
CC arch/x86/boot/cpu.o
MKPIGGY arch/x86/boot/compressed/piggy.S
AS arch/x86/boot/compressed/piggy.o
LD arch/x86/boot/compressed/vmlinux
ZOFFSET arch/x86/boot/zoffset.h
OBJCOPY arch/x86/boot/vmlinux.bin
AS arch/x86/boot/header.o
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
BUILD arch/x86/boot/bzImage
Setup is 17388 bytes (padded to 17408 bytes).
System is 3131 kB
CRC 43b226da
Kernel: arch/x86/boot/bzImage is ready (#1)
İşlem bitiminde kullanacağımız kernel imaj dosyası arch/x86/boot
dizini altında oluşur.
Diğer mimariler için derleme yaptığımızda
arch/<mimari>/boot
dizini altında oluşacaktır.
Derleme sürecini yönettiğimiz kernel ana dizininde ise vmlinux
adında bir dosya oluştuğunda dikkat ediniz. Bu dosya kernel imajının sıkıştırılmamış halidir:
$ ls -lh vmlinux
-rwxr-xr-x 1 demirten demirten 120M May 16 07:58 vmlinux
$ file vmlinux
vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked,
BuildID[sha1]=f6c3556c7b74f9b300b03275831a4b716d18ee9e, not stripped
$ ls -lh arch/x86/boot/bzImage
-rw-r--r-- 1 demirten demirten 3.1M May 16 07:58 arch/x86/boot/bzImage
Görüldüğü üzere sıkıştırılmamış hali 120 MB iken, sıkıştırılmış hali 3.1 MB seviyelerindedir.
Kernel imajı üretildikten sonra modüllerin derlenmesi ve uygun dizin yapısı ile sistemde oluşturulması gerekir. Bu işlemler için modules
ve modules_install
make hedefleri kullanılır:
$ make modules
$ make modules_install
modules_install
hedefi, modüllere ait dizin yapısını öntanımlı olarak derlemenin yapıldığı sistemde, /lib/modules/<KERNEL-VERSION>
dizini altında oluşturacaktır. Eğer derlediğimiz kernel imajını kendi sistemimizde kullanmak istemiyorsak (çapraz derleme vb.) modulleri ayrı bir dizine install
etmemiz gerekir. Bunun için INSTALL_MOD_PATH
değişkenini aşağıdaki gibi kullanmalısınız:
$ make modules_install INSTALL_MOD_PATH=/tmp/modules
İşlem sonucunda tüm modüller /tmp/modules
dizini altındaki dizin yapıları içerisinde oluşturulacaktır.
Paralel Derleme
Derleme süreci oldukça cpu yoğun bir işlemdir. Ek bir parametre verilmemesi halinde sadece tek bir cpu core kullanılır. Oysa kernel içerisindeki Makefile dosyaları paralel derlemeye imkan verecek şekilde düzenlenmiştir. Birden fazla cpu core var ise, bunları maksimum düzeyde kullanmak ve derleme sürecini çok daha çabuk sonuçlandırmak için, paralel derleme yöntemini uygulayabilirsiniz. Bu yöntemde kaç adet paralel derleme süreci olacağını -j N
parametresi ile verebilirsiniz.
Genel bir yaklaşım, sistemdeki tüm kapasiteyi kullanmak istiyorsanız cpu core sayısının 2 katı kadar bir değer kullanmak yönündedir. Bunun sebebi derleme sürecinde arada gcc
dışında da betik uygulamaları vb. çalıştığından tam olarak cpu core sayısı verildiğinde atıl kalan bir kapasite olmasıdır. 2 katı gibi bir değer verildiğinde sistemin tüm performansından faydalanabilirsiniz:
$ make bzImage -j 8