2012-05-16 2 views
0

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

ответ

4

Ответ заключается в том, чтобы взломать библиотеку 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.

+0

ОБНОВЛЕНИЕ: Xcode 4.4 изменяет способ сборки ассемблера и не будет компилировать файл lib1funcs.asm из коробки. Чтобы использовать старый ассемблер, добавьте -no-интегрированный в раздел «Другие флаги C» параметров сборки проекта для каждой из ваших целей, которые используют ассемблер. –

+0

Теперь, когда armv6 удаляется из Xcode 4.5, те из вас, кто застрял в библиотеках armv6, могут прибегнуть к описанному выше. –

+0

Вместо того, чтобы использовать lib1funcs.asm, кто-то из Apple предлагал вместо этого использовать версии switch8 и switch16 вместо compiler-rt. compiler-rt/lib/arm/switch8.S и compiler-rt/lib/arm/switch16.S. http://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/arm/ –