Функция библиотеки objdump выводит

У меня есть следующий вывод objdump при отладке сбоя. Я мог бы сузить вопрос до следующей функции LanManager::Interface() библиотечная функция, но с моим небольшим опытом работы с объектным кодом я не смог выработать гораздо больше смысла из вывода objdump.

Ниже находится начальная часть этой библиотечной функции. Я хотел бы знать:

  • Является ли начальный адрес адресом самой функции?
  • Какое отношение имеет адрес этой функции и адрес основного исполняемого файла, который использует функцию?
  • Краткое объяснение трех столбцов в этом выводе 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]

0

Решение

Я постараюсь пролить немного света здесь, но для большей глубины вы можете проверить текст о программировании на ассемблере в ARM или обратном инжиниринге.

Вы смотрите на разборку для LanManager::Interface, Да, 0003629c это значение самого указателя функции. Ваши три столбца выглядят так:

| адрес | коды операций | разборка |

_init это другой символ где-то в файле, который вы разобрали. Кажется странным, что LanManager :: Interface разветвляет в каком-то месте целую страницу от начала другой функции.

Когда у двоичного файла были удалены символы, и objdump пытается определить символическое имя для адреса, он продолжит сканирование в обратном направлении, пока не найдет его. Скорее всего _init это просто точка входа или что-то, я забыл имена, выдаваемые компилятором на макушке.

Вы можете покопаться в gdb и разобрать конкретные адреса с помощью (gdb) disas *0x119ec, Тем не менее, вы действительно никогда не говорите о том, какой сбой вы видите в первую очередь … если бы вы написали программу, которая умирает при вызове библиотеки, я бы потратил больше времени на просмотр аргументов, которые вы передали.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]