Debugger/GDB

[GDB] 라이브러리 함수 분기에 대하여...

우와해커 2020. 1. 5. 12:18


왜 사용자 함수는 되고 공유라이브러리? 함수 분기에 대한 disassemble은 안되는지...?

   0x000104f0 <+24>: ldr r3, [pc, #92] ; 0x10554 <getpath+124>
   0x000104f4 <+28>: ldr r3, [r3]
   0x000104f8 <+32>: mov r0, r3
   0x000104fc <+36>: bl 0x10374

 

막상 s를 입력하여 0x10374로 분기하면 그 다음 명령어들은 건너뛰고 printf함수로 이동되었다.


gef> x/10i 0x20718
   0x20718: andeq r0, r0, r0
   0x2071c: andeq r0, r0, r0 gef> x/5i 0x10374
   0x10374: add r12, pc, #0, 12

gef> disassemble 0x10374
No function contains specified address.

 

 

s는 바로 넘어가서 확인이 불가능한데, si로 실행하면 명령어를 입력하니까 보이는 그대로 실행하여 따라갈 수 있다.

확인 결과 라이브러리에 존재하는 함수(printf)를 사용하기 위해 조금 복잡한 처리가 존재하였다.

 

s는 이 과정을 건너뛰고 바로 printf문으로 이동해주니 디버깅 하는 입장에서 뜬금포일 수 밖에 없다.

 

bl 0x10374는 이처럼 컴파일러가 printf 라이브러리의 주소를 구하기 위한 분기 주소라고 보면 될 것 같다.

 

* 디버깅 과정에서 내린 추측일뿐, 잘못된 정보일 수 있으니 잘 아시는분은 댓글로 부탁드립니다.