gdbを読む

  • gdb 7.12.1

  • include/gdb/callback.h
    • host_callbackとCB_SYSCALLの定義
    • #define CB_SYS_write 5 (4ではない)
  • sim/common/callback.c
  • sim/common/syscall.c
    • cb_syscall()
      • switch-caseでCB_SYS_writeを処理
  • sim/arm/armos.c
    • ARMulator
    • デバッグモニタ
      • ブートローダ強化版みたいな
      • 独自のシステムコール番号←Linuxのそれと異なる
      • Demon /* This file contains a model of Demon,
      • Angel
        • ADP (Angel Debug Protocol)
          • 引数のデータの先頭のアドレスをr1に入れる方式
      • RedBoot
    • ARMul_OSHandleSWI(state, number)
      • numberが以下のどれかのときwriteする→swi #0に対応する処理がない
        • Demon: SWI_Write(=0x69)←Demon
        • RedBoot: 0x180001かつ r0が5
        • Angel: AngelSWI_(ARM→0x123456 Thumb→0xab) かつ r0がAngelSWI_Reason_Write(=5)
      • ADP_Stopped_ApplicationExit←デバッグ用
  • sim/README-HACKING
    • なんかいろいろ書いてある
    • システムコール発行時にはcb_syscall()が呼ばれる

実機とgdb

  • 実機のDebian/ARMではうごくのにgdbのシミュレータでは動かないアセンブラ←なぜ?
    • https://sechack365.backlog.jp/view/SECHACK365_TRAINEE2018-55
    • eABIで、r7にwrite(=4)をセットしたあとswi 0する
 .data
 msg: .asciz "hi system call\n"
 .set len, . - msg
  
 .text
          .global _start
	
	_start:
          mov r0, #0
          ldr r1, msgaddr
          mov r2, #len
          mov r7, #4
          swi #0
          
          mov r7, #1
          swi #0
          
          .align 4
   
 msgaddr: .long msg
  • Debian/ARMサーバのほうはeABIっぽい
      user@debian-armel:~$ gcc -dumpmachine
      arm-linux-gnueabi
    
  • gdbなどのtoolchainのパッケージは他のABI(oABI?)がデフォルトで、eABIのを使うには-eabiとついたものを入れる必要がある…?
  • grepしてみてもPowerPCのeABIしか出てこない…w
  • gcc-arm-none-eabiのソースコードにはsim/(シミュレータ)が含まれていない…どこにあるんだろう?
  • 以下のように書き換えたら動いた
    • swi #0x69
  • 逆にeABIなDebian/ARM上でこれを動かすと出力されない
 .data
 msg:
         .ascii "hi system call\n"
	len = . - msg
 
 .text
          .globl  main
 main:
          mov     r2, #len
          ldr     r1, msgaddr
          mov     r0, #1
          swi     #0x69
 
           .align  4
 msgaddr:
           .long   msg

Backlinks