혹시나 나중에 Makefile를 분석 하게 되는 시점이 올지 모르겠지만, 선행된 스터디에서 분석을 한번 했기 때문에
지금은 make 로그만 보고, 잃어 버린 기억을 상기한다.
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
--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 를 사용한다.
이는 커널 소스를 분석하는데 매우 중요한 파일 이다.
'리눅스커널' 카테고리의 다른 글
[다시 보는 ARM 3.x 커널] 링커 스크립터 ( Linker Script ) (0) | 2011.09.26 |
---|---|
[다시 보는 ARM 3.x 커널] 커널 분석 어디서 부터 시작 하는가? (0) | 2011.09.22 |
[다시 보는 ARM 3.x 커널] 툴체인 설치, 커널 컴파일, 소스 분석 준비 (0) | 2011.09.22 |
[ kmem_cache_init ] mm/slab.c (0) | 2009.10.02 |
[ IRQ 처리 ] (0) | 2009.10.02 |