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

Как вырезать символы Objective-C из двоичного файла OS X?

Хорошо, я знаю, что были другие сообщения о том, как вы не можете на самом деле вырезать символы Objective-C из двоичного файла OS X, потому что они необходимы для работы Obj-C вообще, но мой случай немного отличается.

У меня есть один бинарный файл, который является пакетом. Он предназначен для использования в качестве плагина VST или плагина AudioUnit. Идея состоит в том, что двоичный файл содержит все точки входа для обоих форматов, и вы просто компилируете его один раз, а затем называете одну копию ".vst" для версии VST и ". компонент" для версии AU. (Это использует интерфейс JUCE BTW.)

Проблема в том, что для стороны AU вы должны экспортировать класс Obj-C для создания представления Cocoa UI. На стороне VST этот класс никогда не будет использоваться. Но если у вас есть хост Ableton Live, который позволяет одновременно загружать версии AU и VST одного и того же плагина, теперь мы сталкиваемся с типичной проблемой столкновения пространства имен Obj-C.

На стороне VST этот конкретный класс Obj-C никогда не будет использоваться. Так что я хотел бы сделать это, чтобы разбить эти классы Obj-C из результирующего бинарного файла, используя "strip". Это все еще сохраняет преимущество просто компиляции всего один раз для обоих форматов.

Во всяком случае, я пробовал использовать "strip -R stripfile.txt <path to binary>", где stripfile.txt содержит символы, которые я хочу разбить, но он всегда терпит неудачу, говоря, что символы не могут быть найдены в двоичном формате. Я пробовал манипулировать именами в файле strip, но это не помогает (или я делаю это неправильно).

Вот соответствующие символы, которые я хочу разбить, как вывод с помощью "nm -m":

000000000003bb00 (__TEXT,__text) non-external -[JuceDemoProjectAU description]
000000000003bb60 (__TEXT,__text) non-external -[JuceDemoProjectAU interfaceVersion]
000000000003ba00 (__TEXT,__text) non-external -[JuceDemoProjectAU uiViewForAudioUnit:withSize:]
0000000000b02398 (__DATA,__objc_data) external _OBJC_CLASS_$_JuceDemoProjectAU
0000000000b023c0 (__DATA,__objc_data) external _OBJC_METACLASS_$_JuceDemoProjectAU

Любые идеи?

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

4b9b3361

Ответ 1

Вы не можете просто просто удалить класс из двоичного файла. Однако вы можете обмануть среду выполнения Objective-C, полагая, что ваш плагин не содержит никакого кода Objective-C. Просто измените __objc_imageinfo на __objc_imageinfX, например, в своем двоичном коде VST. Вы можете сделать это легко с помощью perl:

perl -pi -e 's/__objc_imageinfo/__objc_imageinfX/g' <path to binary>

После исправления плагина VST вся инициализация Objective-C будет обходить, и вы не увидите это сообщение об ошибке: Class JuceDemoProjectAU is implemented in both …/VSTPlugin and …/AUPlugin. One of the two will be used. Which one is undefined.

Опасайтесь, вы действительно не должны использовать этот трюк! Соответствующее решение вашей проблемы - либо скомпилировать две разные версии вашего плагина, либо динамически регистрировать классы, как предлагалось другими.

Ответ 2

В прошлом году в Coreaudio-списке произошел поток, похожий на это: Столкновение между классами Cocoa для плагинов AU и VST.

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