У меня есть следующий вывод objdump при отладке сбоя. Я мог бы сузить вопрос до следующей функции LanManager::Interface()
библиотечная функция, но с моим небольшим опытом работы с объектным кодом я не смог выработать гораздо больше смысла из вывода objdump.
Ниже находится начальная часть этой библиотечной функции. Я хотел бы знать:
_init
? Это начало функции?<_init+0x10e4>
указывает на?Я не ожидаю полного ответа, просто все, что проливает свет, будет оценено.
0003629c <LanManager::Interface()>:
3629c: e1a0c00d mov ip, sp
362a0: e92dd9f0 push {r4, r5, r6, r7, r8, fp, ip, lr, pc}
362a4: e59f40b8 ldr r4, [pc, #184] ; 36364 <LanManager::Interface()+0xc8>
362a8: e24cb004 sub fp, ip, #4 ; 0x4
362ac: e24dd004 sub sp, sp, #4 ; 0x4
362b0: e59f70b0 ldr r7, [pc, #176] ; 36368 <LanManager::Interface()+0xcc>
362b4: e08f4004 add r4, pc, r4
362b8: e59f50ac ldr r5, [pc, #172] ; 3636c <LanManager::Interface()+0xd0>
362bc: e7940007 ldr r0, [r4, r7]
362c0: ebff6dc9 bl 119ec <_init+0x10e4>
362c4: e7942005 ldr r2, [r4, r5]
362c8: e5923000 ldr r3, [r2]
362cc: e3530000 cmp r3, #0 ; 0x0
362d0: 0a000005 beq 362ec <LanManager::Interface()+0x50>
362d4: e7943005 ldr r3, [r4, r5]
362d8: e7940007 ldr r0, [r4, r7]
362dc: e5934000 ldr r4, [r3]
Я постараюсь пролить немного света здесь, но для большей глубины вы можете проверить текст о программировании на ассемблере в ARM или обратном инжиниринге.
Вы смотрите на разборку для LanManager::Interface
, Да, 0003629c
это значение самого указателя функции. Ваши три столбца выглядят так:
| адрес | коды операций | разборка |
_init
это другой символ где-то в файле, который вы разобрали. Кажется странным, что LanManager :: Interface разветвляет в каком-то месте целую страницу от начала другой функции.
Когда у двоичного файла были удалены символы, и objdump пытается определить символическое имя для адреса, он продолжит сканирование в обратном направлении, пока не найдет его. Скорее всего _init
это просто точка входа или что-то, я забыл имена, выдаваемые компилятором на макушке.
Вы можете покопаться в gdb и разобрать конкретные адреса с помощью (gdb) disas *0x119ec
, Тем не менее, вы действительно никогда не говорите о том, какой сбой вы видите в первую очередь … если бы вы написали программу, которая умирает при вызове библиотеки, я бы потратил больше времени на просмотр аргументов, которые вы передали.
Других решений пока нет …