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

Çapraz Derleme

results matching ""

    No results matching ""