Я пытаюсь реализовать некоторые части того, что делает dyld, и я немного застрял на батуте.Как разрешить dyld импортированные символы?
Рассмотрим следующую инструкцию ARM:
BL 0x2fec
Разветвляется с рычажным (подпроцедуру вызова) в 0x2fec. Я знаю, что в __TEXT-сегменте есть раздел __symbolstub1, начинающийся с 0x2fd8, так что это переход к 20 байтам внутри __symbolstub1.
Теперь есть символ
(undefined) external _objc_autoreleasePoolPush (from libobjc)
что я решена с помощью команды LC_SYMTAB нагрузки. Неизвестного адреса нет. Я знаю, как факт, что адрес 0x2fec является батутом для _objc_autoreleasePoolPush, но я не могу доказать это с помощью каких-либо средств.
Я проверил команду LC_DYLD_INFO_ONLY, и у меня был легкий намек на то, в lazy_bind символов я нашел:
{:offset=>20, :segment=>2, :library=>6, :flags=>[], :name=>"_objc_autoreleasePoolPush"}
, где имя и смещение соответствует тому, что у меня есть точно, и библиотека # 6 - «/usr/lib/libobjc.A.dylib», которая также идеальна. Теперь проблема в том, что сегмент №2 - __TEXT, но __TEXT начинается с 0x1000, а __symbolstub1 находится там, где 0x2fd8. Поэтому мне не хватает ссылки на раздел.
Любые идеи о том, как я должен отображать виртуальный адрес 0x2fec в _objc_autoreleasePoolPush?
Я предполагаю, что это может быть интересно для вас, чтобы прочитать эти сообщения (описывают архитектуру Intel, но в любом случае): http://www.codeproject.com/Articles/187181/Dynamic-Linking-of-Imported -Functions-in-Mach-O http://www.codeproject.com/Articles/187192/Redirection-of-Imported-Functions-in-Mach-O Или на русском: http://habrahabr.ru/пост/115558 – shoumikhin