- objdump: 라이브러리나 ELF(Executable and Linkable Format) 형식의 파일을 어셈블리어로 출력
- as: 어셈블러
- ld: 링커
- addr2line: 주소를 파일과 라인으로 출력
- nm: 오브젝트 파일의 심벌을 출력
- readelf ELF 파일의 내용을 출력
objdump를 활용해 리눅스 커널의 오브젝트 파일인 vmlinux의 원하는 부분만 어셈블리어로 출력해 볼 수 있다.
앞으로 이런식으로 커널 어셈블리 코드를 확인한다.
vmlinux와 System.map 파일을 재료로 사용한다.
- vmlinux : 리눅스 커널을 포함하는 오브젝트 파일
- System.map : 커널에 의해 사용되는 심볼테이블
# cp ./out/lib/modules/4.19.127-v7+/build/vmlinux ./kernel_obj
# cp ./linux/System.map ./kernel_obj
System.map 파일을 vi로 열어서 schedule 함수의 start address를 확인할 수 있다. 자연스럽게 그다음 심볼 주소는 schedule 함수의 끝이 된다.
System.map
30805 8086b01c T schedule
30806 8086b0c8 T yield
시작과 끝 주소를 가지고 objdump를 이용해 커널 오브젝트를 읽어보면 schedule 함수의 어셈블리 코드를 확인할 수 있게 되는 것이다.
# objdump --start-address=0x8086b01c --stop-address=0x8086b0c8 -d vmlinux
vmlinux: file format elf32-littlearm
Disassembly of section .text:
8086b01c <schedule>:
8086b01c: e1a0c00d mov ip, sp
8086b020: e92dd830 push {r4, r5, fp, ip, lr, pc}
8086b024: e24cb004 sub fp, ip, #4
8086b028: e52de004 push {lr} ; (str lr, [sp, #-4]!)
8086b02c: ebe296ef bl 80110bf0 <__gnu_mcount_nc>
8086b030: e1a0300d mov r3, sp
8086b034: e3c33d7f bic r3, r3, #8128 ; 0x1fc0
8086b038: e3c3303f bic r3, r3, #63 ; 0x3f
8086b03c: e593300c ldr r3, [r3, #12]
8086b040: e5932000 ldr r2, [r3]
8086b044: e3520000 cmp r2, #0
8086b048: 0a000002 beq 8086b058 <schedule+0x3c>
8086b04c: e5932558 ldr r2, [r3, #1368] ; 0x558
8086b050: e3520000 cmp r2, #0
8086b054: 0a000009 beq 8086b080 <schedule+0x64>
8086b058: e3a04a0e mov r4, #57344 ; 0xe000
8086b05c: e34f4fff movt r4, #65535 ; 0xffff
8086b060: e3a00000 mov r0, #0
8086b064: ebfffd71 bl 8086a630 <__schedule>
8086b068: e1a0300d mov r3, sp
8086b06c: e0033004 and r3, r3, r4
8086b070: e5933000 ldr r3, [r3]
8086b074: e3130002 tst r3, #2
8086b078: 089da830 ldmeq sp, {r4, r5, fp, sp, pc}
8086b07c: eafffff7 b 8086b060 <schedule+0x44>
8086b080: e5930598 ldr r0, [r3, #1432] ; 0x598
8086b084: e3500000 cmp r0, #0
8086b088: 0afffff2 beq 8086b058 <schedule+0x3c>
8086b08c: e5903000 ldr r3, [r0]
8086b090: e1500003 cmp r0, r3
8086b094: 0a000002 beq 8086b0a4 <schedule+0x88>
8086b098: e3a01001 mov r1, #1
8086b09c: ebf25135 bl 804ff578 <blk_flush_plug_list>
8086b0a0: eaffffec b 8086b058 <schedule+0x3c>
8086b0a4: e1a03000 mov r3, r0
8086b0a8: e5b32008 ldr r2, [r3, #8]!
8086b0ac: e1530002 cmp r3, r2
8086b0b0: 1afffff8 bne 8086b098 <schedule+0x7c>
8086b0b4: e1a03000 mov r3, r0
8086b0b8: e5b32010 ldr r2, [r3, #16]!
8086b0bc: e1530002 cmp r3, r2
8086b0c0: 1afffff4 bne 8086b098 <schedule+0x7c>
8086b0c4: eaffffe3 b 8086b058 <schedule+0x3c>
참고한 내용 : http://rousalome.egloos.com/10009180