Подтвердить что ты не робот

Удаление вызова метода изнутри статического lib (.a) без перекомпиляции

Я использую статический lib, который дает мне предупреждение при загрузке моего двоичного файла для просмотра apple.

Метод в статической lib, вызывающий предупреждение (непубличные селекторы), никогда не вызывается мной, его соответствующий .h удаляется из моего proj, но предупреждение все еще сохраняется.

Учитывая, что я знаю имя метода, вызывающее проблему, есть ли способ открыть или отредактировать этот .a и прокомментировать/удалить фрагмент кода, а затем использовать измененный .a в моем проекте.

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

Большое спасибо, -Cake

4b9b3361

Ответ 1

Быстрое и грязное решение: откройте файл .a в шестнадцатеричном редакторе и измените все экземпляры имени. Оставьте имя функции той же длины, чтобы смещения в файле не менялись, просто измените букву или что-то в этом роде. Я сделал быстрый тест, добавив фиктивную функцию в подпроект, который мы создаем как статическую библиотеку, затем изменил имя функции в файле .a(было пять экземпляров, для чего это стоит), и все построено хорошо. Я не вижу причин, по которым он не прошел бы проверку App Store после этого.

Я действительно удивлен, что функция все еще была в финальной сборке, хотя я думал, что Dead Code Stripping должен был очистить любой неиспользуемый код. Да.

Ответ 2

http://opensource.apple.com/source/cctools/cctools-809/

Я не могу позволить себе получить свою награду, потому что я не предоставил простое решение. Но да, это теоретически возможно. У вас есть работа, вырезанная для вас.

Ответ 3

Не нужно взламывать двоичные файлы. Просто отключите предупреждение "неиспользуемые селекторы" компилятора: -fno-unused-selectors.

Ответ 4

В зависимости от вашей библиотеки и проекта существует несколько решений.

В настройках сборки:

  • Включить " удаление мертвого кода", если это возможно: если метод никогда не используется (даже внутри), символ будет удален.

  • Используйте " Файл с неэкспонированными символами": просто добавьте символ в файл и он будет удален из двоичного файла. Это будет работать, даже если символ используется внутри.

  • Включить " Постепенная обработка развертывания" и " Связанный с лентой продукт" с Стиль полосы ", установленный на" Все символ "

  • (Не уверен) Используйте " Символы, скрытые по умолчанию". Это связано с генерированием кода и не должно влиять на привязку, но на всякий случай все вышеописанное не удалось...