Вопрос по ios – Как использовать сторонние библиотеки armv6 в приложении armv7?

0

У меня есть две сторонние библиотеки. Один просто имеет сборку для armv6, а другой - сборку для armv7. Мне нужно использовать оба из них в моем корпоративном приложении iOS. Я попросил поставщиков библиотеки armv6 предоставить версию armv7, но они не смогли этого сделать. (Примечание. Я уже получил ответ и предоставлю его. Кто-то еще спросил об этом в комментарии, и не хватило места для ответа, поэтому я создал свой вопрос и предоставлю свой ответ.)

Ваш Ответ

1   ответ
4

Ответ заключается в том, чтобы заставить библиотеку armv6 думать, что это библиотека armv7. Это заставит вас работать, пока поставщик не предоставит библиотеку. Причина, по которой это работает, заключается в том, что спецификация руки требует, чтобы все архитектуры руки могли выполнять код, сгенерированный предыдущими архитектурами. Таким образом, если библиотека armv6 сообщает компоновщику, что это armv7, процессор все равно должен быть в состоянии выполнить код. Конечно, вы не можете пойти другим путем. Используйте otool -h в обеих библиотеках, чтобы увидеть cutype и cpusubtype. В моих библиотеках это было 12 для обоих типов и 6 и 9 для подтипов, указывающих armv6 и armv7. Используя шестнадцатеричный редактор, найдите шестнадцатеричную строку 0xcefaedfe, которая является маркером MH_MAGIC (0xfeedface), обратным из-за большого / меньшего числа байтов

После этого есть целое слово с 0xC. Это 12 для cutype. Далее слово для 0x6. Измените это на 0x9 для всех случаев. Теперь ld будет считать вашу библиотеку armv7 и действовать соответственно.

Вы, вероятно, не сделали этого, потому что armv6 мог быть связан в некоторых подпрограммах библиотеки превью. Если вы получаете ошибки ссылки (у меня есть некоторые для switch8 и switch16), вам нужно найти код Дарвина, который их имеет. Поищи файлlib1funcs.asm в сети. Это, вероятно, будет иметь ваши недостающие функции. Они, вероятно, обусловлены, поэтому настройте #ifdefs и убедитесь, что они компилируются. Этот файл пытается открыть некоторые включения в конце, но, поскольку они находятся в конце, они ни на что не влияют, поэтому просто закомментируйте их.

Да, это огромный взлом, но он заставляет вас работать. Если вы получили вашу исправленную библиотеку, вам просто нужно вставить ее. Никаких изменений кода не требуется. Если это работает для вас, вы все еще используете код Apple, и это был бы тот же код, который вы выполняли бы, если бы вы работали только на armv6.

Error: User Rate Limit Exceeded Owen Hartnett
Error: User Rate Limit Exceeded Owen Hartnett
Error: User Rate Limit Exceededllvm.org/svn/llvm-project/compiler-rt/trunk/lib/arm Owen Hartnett

Похожие вопросы