2012-04-16 11 views
2

Я пытаюсь реализовать некоторые части того, что делает 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?

ответ

1

Хех, немного больше копания, и я нашел его в косвенных символах LC_DYSYMTAB.

Теперь длинный ответ.

  1. Найти раздел по данному адресу;
  2. секция должна быть типа S_NON_LAZY_SYMBOL_POINTERS, S_LAZY_SYMBOL_POINTERS, S_LAZY_DYLIB_SYMBOL_POINTERS, S_THREAD_LOCAL_VARIABLE_POINTERS или S_SYMBOL_STUBS;
  3. Если тип сечения S_SYMBOL_STUBS, размер байта хранится в reserved2, в противном случае считается равным 4;
  4. Таблица смещения в непрямые символы хранится в reserved1;
  5. Индекс в таблице косвенных символов рассчитывается как

    индекс = sect.reserved1 + (vmaddr - sect.addr)/bytesize;

  6. Символ в таблице символов находится в символах [непрямые_символы [указатель]].

+0

Я предполагаю, что это может быть интересно для вас, чтобы прочитать эти сообщения (описывают архитектуру 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