Слить исполняемый файл Mach-O со статической библиотекой?

Предположим, у вас есть

  1. предустановленное исполняемое приложение iOS (для симулятора или устройства).
  2. встроенная статическая библиотека статических библиотек, которая, помимо прочего, содержит статические инициализаторы c ++.

Теперь должно быть возможно объединить два встроенных продукта, чтобы создать новый исполняемый файл iOS, который похож на старый, за исключением того, что теперь он также связан с дополнительной статической библиотекой и при запуске будет запускать статические инициализаторы статической библиотеки.

Какой инструмент (если есть) может помочь решить эту проблему слияния?

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

7

Решение

Как работает компилятор (в простом объяснении)

Самые популярные компиляторы C ++ (например, GCC) работают путем перевода всего кода C ++ (и Obj-C, C и т. Д.) В ASM.

Затем он вызывает соответствующий ассемблер для целевого процессора и создает двоичные объекты объекта.

Затем он вызывает компоновщик, который ищет в этих двоичных файлах символы, которые объясняют, что связывает с чем. Обычная оптимизация, которую могут выполнять компоновщики, — это также извлечение окончательного двоичного файла из статически связанных библиотек, которые не использовались, другая общая оптимизация — это не попытка связать вообще неиспользуемые библиотеки.

Также, наконец, компоновщик удаляет вещи, которые нужны только ему.

Что это значит в вашем случае

У вас есть библиотека, библиотека имеет символы ссылки. У вас также есть исполняемый файл, у которого были удалены символы связывания, фактически, в зависимости от того, как он был оптимизирован, внутренние переходы могут быть только парой инструкций jmp к произвольным адресам в коде. Никакая машина не может делать то, что вы хотите, автоматически, потому что у вас нет необходимой информации об исполняемом файле.

Как это сделать?

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

Этот процесс иногда используется разработчиками игр для изменения видеодрайверов старых игр (например, для обновления их версии OpenGL или для принудительного использования в играх Glide некоторых более новых драйверов и т. Д.).

Поэтому, если вы все равно хотите это сделать (предупреждаю: делать это абсурдно безумно …), спросите этих ребят 🙂 Я сейчас не помню, чтобы кто-то указывал на вас, но они существуют.

аналогия

Когда вы находитесь в нормальной фазе компоновки, скомпилированные объектные файлы похожи на исходный код, который понимает машина, полный вызовов функций по мере необходимости.

После компиляции все вызовы функций становятся goto.

Так что, если вы являетесь компоновщиком, которому поручено делать то, что вы хотите сделать, представьте, что вы читаете исходный код, заполненный goto, в случайные места в коде (иногда даже внутри циклов) и что вам нужно как-то понять, какие из них те, которые вы хотите изменить, чтобы перейти к новой части, которую вы пытаетесь вставить туда.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]