Предположим, у вас есть
Теперь должно быть возможно объединить два встроенных продукта, чтобы создать новый исполняемый файл iOS, который похож на старый, за исключением того, что теперь он также связан с дополнительной статической библиотекой и при запуске будет запускать статические инициализаторы статической библиотеки.
Какой инструмент (если есть) может помочь решить эту проблему слияния?
Изменить: приемлемым решением также является динамическая загрузка библиотеки с помощью dlopen. Все это предназначено для тестирования приложений, поэтому повторно связанное приложение никогда не увидит магазин приложений.
Самые популярные компиляторы C ++ (например, GCC) работают путем перевода всего кода C ++ (и Obj-C, C и т. Д.) В ASM.
Затем он вызывает соответствующий ассемблер для целевого процессора и создает двоичные объекты объекта.
Затем он вызывает компоновщик, который ищет в этих двоичных файлах символы, которые объясняют, что связывает с чем. Обычная оптимизация, которую могут выполнять компоновщики, — это также извлечение окончательного двоичного файла из статически связанных библиотек, которые не использовались, другая общая оптимизация — это не попытка связать вообще неиспользуемые библиотеки.
Также, наконец, компоновщик удаляет вещи, которые нужны только ему.
У вас есть библиотека, библиотека имеет символы ссылки. У вас также есть исполняемый файл, у которого были удалены символы связывания, фактически, в зависимости от того, как он был оптимизирован, внутренние переходы могут быть только парой инструкций jmp к произвольным адресам в коде. Никакая машина не может делать то, что вы хотите, автоматически, потому что у вас нет необходимой информации об исполняемом файле.
Вам нужно разобрать исполняемый файл, самостоятельно определить, где находятся вызовы функций, а затем вручную собрать его вместе с вашей библиотекой, изменив вызов этих функций, чтобы вместо этого перейти к адресам в вашей библиотеке.
Этот процесс иногда используется разработчиками игр для изменения видеодрайверов старых игр (например, для обновления их версии OpenGL или для принудительного использования в играх Glide некоторых более новых драйверов и т. Д.).
Поэтому, если вы все равно хотите это сделать (предупреждаю: делать это абсурдно безумно …), спросите этих ребят 🙂 Я сейчас не помню, чтобы кто-то указывал на вас, но они существуют.
Когда вы находитесь в нормальной фазе компоновки, скомпилированные объектные файлы похожи на исходный код, который понимает машина, полный вызовов функций по мере необходимости.
После компиляции все вызовы функций становятся goto.
Так что, если вы являетесь компоновщиком, которому поручено делать то, что вы хотите сделать, представьте, что вы читаете исходный код, заполненный goto, в случайные места в коде (иногда даже внутри циклов) и что вам нужно как-то понять, какие из них те, которые вы хотите изменить, чтобы перейти к новой части, которую вы пытаетесь вставить туда.
Других решений пока нет …