Здравствуйте, возникла проблема во время вызова функции в программе iOS.
Базовый адрес функции, которую я вызываю
Исходный код dylib'а#include <unistd.h>
#include <dispatch/dispatch.h>
#include <mach-o/dyld.h>
static bool (*in_Room)();
%ctor {
in_Room = (bool(*)())(0x1B27CDC + _dyld_get_image_vmaddr_slide(488));
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
while(1)
{
sleep(20);
in_Room();
}
});
}
Я асинхронно с задержкой вызываю функцию, в момент вызова функции программа завершается:
Вот что показал отладчик из-за этой ошибки:
Как я понял, проблема в том, что метод _dyld_get_image_vmaddr_slide вернул не подходящее смещение и из-за этого вызвался неизвестный адрес.
( Вернул смещение 0xda8000, а смещение по которому находится реальный адрес функции в памяти, на тот момент, был 0x11b164000 )
Изменено:
Я предположил что проблема в том, что метод _dyld_get_image_vmaddr_slide находит смещение из неправильной библиотеки, так и оказалось:
Индекс искомой библиотеки был 448 (с учетом встроенной dylib)
Я поменял индекс в коде, но в итоге метод не вернул вообще никакого смещения:
Вызвался чистый базовый адрес функции без смещения: