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

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

Ответ 1

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

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

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

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