Итак, в последнее время я смотрел на разборку моего кода на C ++, и мне пришлось вручную отслеживать, что находится в каждом регистре, например:
95: 48 8b 16 mov (%rsi),%rdx ; %rdx = raggedCross.sink
98: 48 8b 42 38 mov 0x38(%rdx),%rax ; %rax = sink.table
9c: 8b 4a 10 mov 0x10(%rdx),%ecx ; %ecx = sink.baseCol
9f: 48 8b 70 50 mov 0x50(%rax),%rsi ; %rsi = table.starts
a3: 89 c8 mov %ecx,%eax ; %eax = baseCol
a5: 83 c1 1c add $0x1c,%ecx ; %ecx = baseCol + 1
И так далее. Мои комментарии, добавленные вручную, от поиска смещения различных полей (например, адрес, таблица, baseCol, запуски) в классах C ++.
Это просто сделать, но утомительно и отнимает много времени: идеальная вещь для программы. GDB, кажется, знает смещение различных полей в структуре: я могу сделать & ((Table *) 0x1200) -> запуски, и это говорит правильный адрес. Итак, эта информация вокруг.
Есть ли какой-нибудь дизассемблер, который может использовать эту информацию для аннотирования кода для меня?
Если это не удастся, я смогу написать свой собственный. Где GDB получает смещения?