У меня возникли проблемы с сопоставлением смещений в стеке следов аварийных дампов iOS с смещениями при разборке двоичного файла как вывода otool.
Кто-нибудь может подтвердить, как я в принципе согласен с этим. Например, если я получаю строку в дампе сбоя:
0 myapp 0x00005b0a 0x1000 + 19210
Я ожидаю, что смещение команды оскорбления в двоичном файле будет 0x5b0a, 0x4b0a.... или что-то еще?
При декодировании информации заголовка otool также дает, например, эту информацию (фактический код начинается со смещения 0x0000224c в файле):
Section
sectname __text
segname __TEXT
addr 0x0000224c
size 0x00063ad2
offset 4684
align 2^2 (4)
reloff 0
nreloc 0
type S_REGULAR
attributes PURE_INSTRUCTIONS SOME_INSTRUCTIONS
reserved1 0
reserved2 0
Итак, я не был на 100% уверен, что я правильно интерпретировал это, но, похоже, он говорит, что код в + 0x224c в файле заканчивается на смещение 0x124c в памяти, но тогда я не был точно как это установлено, например, с местоположением 0x1000.
Проблема заключается в том, что, учитывая, например, смещение 0x5b0a, ни инструкция там ни в 0x4b0a, ни в 0x6b0a не имеет смысла как фактическая заданная задача (включая тот факт, что, например, местоположения дальше по стеку, t указывает на инструкции ветвления).
(Я знаю, что, по крайней мере, на ранних инкарнациях ARM, было расхождение между значением ПК и соответствующим адресом памяти из-за конвейера команд. Я предполагал, что такая разница будет учитываться в смещения, сообщаемые в дампе сбоя, или, во всяком случае, я видел бы инструкцию по ветвлению на несколько инструкций с одной стороны от той, на которую указывалось, если такая разница не была учтена...)
Может ли кто-нибудь пролить свет?