objdump
로 vmlinux
를 디스어셈블할 수 있지만, objdump
는 기본적으로 해당 시스템의 아키텍처에 종속적이다. 예를 들어 x86_64 시스템에선 ARM 버전의 vmlinux
를 다룰 때 문제가 발생한다.
ARM 버전의 vmlinux
를 잘 디스어셈블해보자.
ARM에서 제공하는 GNU Toolchain을 받자. 위 주소로 접속하여 각자 환경에 맞는 파일을 다운로드한다. 나의 경우 x86_64 리눅스에서 armeabihf 프로세서용 vmlinux를 다룰 예정이므로 AArch32 target with hard float (arm-linux-none-gnueabihf)
버전을 받았다.
objdump
뽑아내기압축을 풀면 다음 경로에 objdump
가 위치한다.
gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/bin/objdump
이 objdump
로 ARM 리눅스용 vmlinux를 디스어셈블할 수 있다.
__irq_svc
인터럽트 벡터를 디스어셈블해보자.
우선 System.map
에서 __irq_svc
심볼의 address를 찾는다.
/* System.map */
...
801018bc t common_invalid
801018e0 t __dabt_svc
80101960 t __irq_svc
801019dc t __und_fault
80101a00 t __und_svc
80101a60 t __und_svc_fault
80101a68 t __und_svc_finish
...
여기서는 0x80101960
에 __irq_svc
심볼이 위치한다.
이제 vmlinux
일부를 디스어셈블해보자.
objdump -d vmlinux --start-address=0x80101960 --stop-address=0x801019dc > __irq_svc.S
이제 __irq_svc
의 어셈블리 코드를 볼 수 있다.
vmlinux: file format elf32-littlearm
Disassembly of section .text:
80101960 <__irq_svc>:
80101960: e24dd04c sub sp, sp, #76 ; 0x4c
80101964: e31d0004 tst sp, #4
80101968: 024dd004 subeq sp, sp, #4
8010196c: e88d1ffe stm sp, {r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}
80101970: e8900038 ldm r0, {r3, r4, r5}
80101974: e28d7030 add r7, sp, #48 ; 0x30
80101978: e3e06000 mvn r6, #0
8010197c: e28d204c add r2, sp, #76 ; 0x4c
80101980: 02822004 addeq r2, r2, #4
80101984: e52d3004 push {r3} ; (str r3, [sp, #-4]!)
80101988: e1a0300e mov r3, lr
8010198c: e887007c stm r7, {r2, r3, r4, r5, r6}
80101990: e1a096ad lsr r9, sp, #13
80101994: e1a09689 lsl r9, r9, #13
80101998: e5991008 ldr r1, [r9, #8]
8010199c: e3a0247f mov r2, #2130706432 ; 0x7f000000
801019a0: e5892008 str r2, [r9, #8]
801019a4: e58d104c str r1, [sp, #76] ; 0x4c
801019a8: eb0412a9 bl 80206454 <trace_hardirqs_off>
801019ac: e59f1024 ldr r1, [pc, #36] ; 801019d8 <__irq_svc+0x78>
801019b0: e1a0000d mov r0, sp
801019b4: e28fe000 add lr, pc, #0
801019b8: e591f000 ldr pc, [r1]
801019bc: eb0411f7 bl 802061a0 <trace_hardirqs_on>
801019c0: e59d104c ldr r1, [sp, #76] ; 0x4c
801019c4: e5891008 str r1, [r9, #8]
801019c8: e16ff005 msr SPSR_fsxc, r5
801019cc: e24d0004 sub r0, sp, #4
801019d0: e1801f92 strex r1, r2, [r0]
801019d4: e8ddffff ldm sp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr, pc}^
801019d8: 80aef210 .word 0x80aef210