Tentei desmontar um arquivo ELF que é um arquivo de objeto compartilhado executado em armv7a (Android). Eu vi um bloco estranho. Parece que o PC
, registro do contador do programa, está definido como 0
. Perdi algo ou fiz algo errado?
O processo vai para 0x1708
no modo ARM. Abaixo está o estranho bloco de código ASM que desmontei do arquivo ELF.
; seção: .plt; função: function_1708 em 0x1708 - 0x17180x1708: 04 e0 2d e5 str lr, [sp, # -4]! 0x170c: 04 e0 9f e5 ldr lr, [pc, # 4] 0x1710: 0e e0 8f e0 add lr, pc, lr0x1714: 08 f0 seja e5 ldr pc, [lr, # 8] !; dados dentro da seção de código em 0x1718 - 0x171c0x1718: b4 77 00 00 | .w .. |
Depois de executar a linha 0x170c
, o LR
register deve ser definido como o valor no endereço 0x1718
. O valor é 0x77b4
(este arquivo é armazenado em little-endian). E vá em frente.
0x1710: lr + = 0x1710 + 8 // lr = 0x8ecc0x1714: pc = * (lr + 8) // pc = * (0x8ed4) lr + = 8
E 0x8ed4 está na seção .got
.
; seção: .got0x8eac: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ | 0x8ebc: 00 00 00 00 58 70 00 00 e0 6e 00 00 00 00 00 00 | .... Xp ... n ...... | 0x8ecc: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 17 00 00 | ....... ......... | 0x8edc: 08 17 00 00 08 17 00 00 08 17 00 00 08 17 00 00 | ................ | 0x8eec: 08 17 00 00 08 17 00 00 08 17 00 00 08 17 00 00 | ................ | 0x8efc: 08 17 00 00 08 17 00 00 08 17 00 00 08 17 00 00 | ................ | 0x8f0c: 08 17 00 00 08 17 00 00 08 17 00 00 08 17 00 00 | ............. ... | 0x8f1c: 08 17 00 00 08 17 00 00 08 17 00 00 08 17 00 00 | ................ | 0x8f2c: 08 17 00 00 08 17 00 00 08 17 00 00 08 17 00 00 | ................ | 0x8f3c: 08 17 00 00 08 17 00 00 08 17 00 00 08 17 00 00 | ..... ........... |
Parece que o valor em 0x8ed4
é zero. Eu rastreei este bloco estranho de JNI_OnLoad ()
, então nenhum dado deve ser modificado antes de executar este bloco.
Eu fiz algo errado ou este é um comportamento específico do ARM arquitetura?