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