2015-02-18 3 views
4

Это очень обсуждаемый предмет, особенно в последнее время. Надеюсь, это не обман, поскольку я перешел ко всем другим вопросам.Вызов dlopen на ios

Меня не интересует, законно это или нет. Хотя на 100% не ясно, можете ли вы свободно делать то, что хотите, с помощью dylib на iOS8, кажется, что допустимо некоторое количество динамической загрузки (см., Например, Can you build dynamic libraries for iOS and load them at runtime?).

Меня интересует только то, что делает работу dlopen (забудьте о подарках на данный момент)! У меня очень простой пример iOS, где я вручную делаю dlopen, а затем dlsym, чтобы вызвать функцию в доморощенном dylib. Это отлично работает на симуляторе, но не работает на устройстве. Устройство работает под управлением iPhone 4s (без взлома) iOS 7.1.2.

AFAIK законно звонить в dlopen даже на iOS 7, так как есть явные инструкции Apple о том, как их поддерживать (см. Здесь «Развертывание содержащего приложения для старых версий iOS» здесь https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW3).

Я предполагаю, что основная причина - это что-то простое, например, dylib, находящееся в папке, которой iOS не нравится для двоичных файлов. У кого-нибудь есть опыт, который делает это, и знаю, что такое ограничения, или, возможно, знает, что я делаю неправильно.

FYI мой код нагрузки:

NSString* resourcePath = [[NSBundle mainBundle] resourcePath]; 
NSString* dlPath = [NSString stringWithFormat: @"%@/frameworktest", resourcePath]; 
const char* cdlpath = [dlPath UTF8String]; 
void* hModule = dlopen(cdlpath, RTLD_LAZY); 

dylib (frameworktest) была создана путем создания Cocoa Touch Framework, создание и захвата dylib бинарного от встроенного каркаса и добавления к ресурсам проекта (в Корневая папка). otool показывает dylib в качестве библиотеки dynmic armv7, ориентированной на версию ios min версии 7.0. Я могу успешно сфотографировать файл, поэтому я знаю, что ищу подходящую папку.

Я могу шагнуть глубоко в сборник dlopen. До сих пор на самом деле он стал неинформирующим, ища очевидные неудачи :)

Любые идеи?

+2

Подключен ли ваш dylib? – duskwuff

+0

Вы получаете сообщение об ошибке? Если это так, вы должны указать, что это такое. Все, что вы говорите, это «... но не работает на устройстве» *. Я также нашел 'RTLD_GLOBAL | RTLD_LAZY' полезен. Я отказываюсь от него, если просто «RTLD_LAZY» терпит неудачу. (Но это на других операционных системах). Если все остальное не удастся, вы можете попробовать просить [Jailbreak QA] (http://www.jailbreakqa.com/). Они часто знают об этих типах угловых случаев. – jww

+0

@ duskwuff Дилиб такой же, как и для сборки фреймов, поэтому беззнаковый (я бы ожидал).Будет ли это действительно нужно подписать для отладки? Любая идея о том, как его подписать (я рассмотрю надлежащий метод построения и упаковки фреймворков - это может ответить на этот вопрос и вообще мой вопрос). –

ответ

2

Проверка errno после звонка в dlopen Я вижу EPERM (не большой сюрприз, я думаю).

Я добавил фазу кодов для сборки, чтобы выразить знак дилиба, и теперь он работает.

Дополнительная информация: Интересно, что фаза знака для приложения по умолчанию работает по всему пакету .app, а не только к главному бинарному приложению (никогда не пристально смотри на это). Поэтому можно было бы ожидать, что это также подпишет дилиб. Фактически, когда моя пользовательская фаза запускает коды, выводит «замену существующей подписи». Однако это может происходить из первоначальной сборки фреймворка. Я проверил фазы для этого проекта, и рамка также подписана (опять же, не только dylib, но и вся инфраструктура передается в код). Параметры знака одинаковы. Так что, где-то вдоль тропы, улыбка становится неправильно подписанной. Я расскажу об этом более подробно в какой-то момент и отправлю обратно, если есть какая-то интересная информация. Я предполагаю, что я нарушаю систему, вручную создавая, извлекая и упаковывая dylib!

Спасибо @jww и @duskwuff за предложения!

 Смежные вопросы

  • Нет связанных вопросов^_^