혹시나 나중에 Makefile를 분석 하게 되는 시점이 올지 모르겠지만, 선행된 스터디에서 분석을 한번 했기 때문에
지금은 make 로그만 보고, 잃어 버린 기억을 상기한다.
x86_64 커널 스터디 때 송형주님이 세미나를 하신 Makefile 분석 문서를 첨부한다. 


1. vmlinux

1) KERNEL_ROOT에 커널 소스를 컴파일한 vmlinux 가 생성된다.

/opt/codesourcery/bin/arm-linux-ld -EL  -p --no-undefined -X --build-id -o vmlinux
-T arch/arm/kernel/vmlinux.lds
  arch/arm/kernel/head.o
  arch/arm/kernel/init_task.o
  init/built-in.o
  --start-group
  usr/built-in.o
  arch/arm/vfp/built-in.o
  arch/arm/kernel/built-in.o
  arch/arm/mm/built-in.o
  arch/arm/common/built-in.o
  arch/arm/mach-exynos4/built-in.o
  arch/arm/plat-s5p/built-in.o
  arch/arm/plat-samsung/built-in.o
  kernel/built-in.o
  mm/built-in.o
  fs/built-in.o
  ipc/built-in.o
  security/built-in.o
  crypto/built-in.o
  block/built-in.o
  arch/arm/lib/lib.a
  lib/lib.a
  arch/arm/lib/built-in.o
  lib/built-in.o
  drivers/built-in.o
  sound/built-in.o
  firmware/built-in.o
  net/built-in.o --end-group .tmp_kallsyms2.o


* 링커 옵션
-EL                             Link little-endian objects
--no-undefined            Do not allow unresolved references in object files
--build-id[=STYLE]      Generate build ID note
-X, --discard-locals    Discard temporary local symbols (default)
-T FILE, --script FILE  Read linker script
-(, --start-group           Start a group
-), --end-group             End a group
-o FILE, --output FILE      Set output file name
 
2) 

$ file vmlinux
vmlinux: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped

2. arch/arm/boot/Image (  커널 이미지에서 주석등을 제거한 바이너리 이미지 )

1) KERNEL_ROOT의 vmlinux에서 binary만 추출한 arch/arm/boot/Image 생성된다.

 

/opt/codesourcery/bin/arm-linux-objcopy -O binary -R .comment -S  vmlinux arch/arm/boot/Image

  
2) 

$ file arch/arm/boot/Image
arch/arm/boot/Image: data



3. arch/arm/boot/compressed/piggy.gzip (  커널 바이너리 이미지를 압축한 파일 )

1) arch/arm/boot/Image를 압축하여 arch/arm/boot/compressed/piggy.gzip 생성된다.

 

cat arch/arm/boot/compressed/../Image | gzip -n -f -9 > arch/arm/boot/compressed/piggy.gzip


2)

$ file arch/arm/boot/compressed/piggy.gzip
arch/arm/boot/compressed/piggy.gzip: gzip compressed data, from Unix, max compression


4. arch/arm/boot/compressed/piggy.gzip.o 
 
1) 커널을 압축한 결과는 piggy.gzip.S 에 의해서 .piggydata 라는 data section에 input_data 변수로 참조되는 배열 형태의 데이터로 포함된다. 나는 이것을 보고, 부트로더에서 부팅 이미지를 배열로 넣고, LCD Controller에 의해서 바로 참조 되도록 응용한 적이 있다.

/opt/codesourcery/bin/arm-linux-gcc   ...(중간생략)...
  -c -o arch/arm/boot/compressed/piggy.gzip.o arch/arm/boot/compressed/piggy.gzip.S


2) ARM의 어셈블리는 바이너리 파일을 단지 인쿠르드 함으로  배열 형식의 변수로 선언 할 수 있다. 궁금하면 piggy.gzip.S 소스를 보도록 해라.
 
3) 

$ file arch/arm/boot/compressed/piggy.gzip.o
arch/arm/boot/compressed/piggy.gzip.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped

  
5. arch/arm/boot/compressed/vmlinux ( 압축 해제 코드 + object 형식으로 된 압축된 바이너리 커널 )

1) 압축된 커널은 data가 되어, 압축해제를 포함 코드와 컴파일 되어 arch/arm/boot/compressed/vmlinux 생성한다.

  /opt/codesourcery/bin/arm-linux-ld -EL --defsym zreladdr=0x40008000
  -p --no-undefined -X -T arch/arm/boot/compressed/vmlinux.lds
  arch/arm/boot/compressed/head.o
  arch/arm/boot/compressed/piggy.gzip.o
  arch/arm/boot/compressed/misc.o
  arch/arm/boot/compressed/decompress.o
  arch/arm/boot/compressed/lib1funcs.o
  -o arch/arm/boot/compressed/vmlinux 


* 링커 옵션
-EL                             Link little-endian objects
--defsym SYMBOL=EXPRESSION  Define a symbol
--no-undefined            Do not allow unresolved references in object files
-X, --discard-locals    Discard temporary local symbols (default)
-T FILE, --script FILE  Read linker script
-o FILE, --output FILE      Set output file name 
 2) 

$ file arch/arm/boot/compressed/vmlinux
arch/arm/boot/compressed/vmlinux: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped

 
6) arch/arm/boot/zImage

1) arch/arm/boot/compressed/vmlinux 에서 binrary 만 추출한 arch/arm/boot/zImage 셍성된다.
  

/opt/codesourcery/bin/arm-linux-objcopy -O binary -R .comment -S  arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage


2) 

$ file arch/arm/boot/zImage
arch/arm/boot/zImage: data


7) 부트로더(u-boot등)에서 사용하는 이미지로 생성하려면, 추가 적인 작업이 있긴 하다. 이 부분은 생략.

8) 커널을 컴파일 하는 과정에서 두개의 vmlinux 파일이 생성되며, 
KERNEL_TOP/vmlinux 를 생성 할 때 링커 스크립터는 arch/arm/kernel/vmlinux.lds 를 사용하고,
  arch/arm/boot/compressed/vmlinux 를 생성 할 때는  arch/arm/boot/compressed/vmlinux.lds 를 사용한다.
이는 커널 소스를 분석하는데 매우 중요한 파일 이다.
 
Posted by blee
,