как найти в арм коде место использования строки

Mar 17, 2017 15:16

arm проигрывает RISC-V в читаемости

Вчера вечером пытался c помощью objdump -d найти место, в котором вызывается dlsym c нужной мне строкой.
Это ад! Смещение строки в файле известно. Известны все места вызова dlsym.
Проблема в том, что таких мест очень много. Но самая большая проблема в том, как в arm загружается адрес строки.

Выглядит это так (пример из другого кода):

82b8:       e59f3024        ldr     r3, [pc, #36]   ; 82e4
  82bc:       e08f3003        add     r3, pc, r3
   ...

82e4:       0000a290        .word   0x0000a290

Тут есть подсказка в виде комментария с адресом ячейки, в котором хранится смещение строки относительно pc.
Получается чтобы узнать какой же адрес строки тут грузится, нам надо вручную просуммировать pc c содержимой промежуточной ячейки (82e4, в примере). Это надо делать  для каждого места в котором загружается адрес строки. И у каждого такого места своя промежуточная ячейка. Для thumb-2 та же фигня.

Если бы это был не arm, а скажем RISC-V, то было бы проще:

10220:       0000c517                auipc   a0,0xc
 10224:       e9450513                addi    a0,a0,-364 # 1c0b4 Опять же тут есть подсказка. Но в отличии от arm, она указывает на загружаемый адрес строки, который нам известен и вычисляется один раз на основе смещения строки в файле. Т.е. дальше нам бы осталось только запустить поиск.

arm, risc-v

Previous post Next post
Up