OK, wiem, że były inne posty o tym, że nie można faktycznie usunąć symboli Objective-C z pliku binarnego OS X, ponieważ są one niezbędne do działania Obj-C, ale moja sprawa jest nieco różne.Jak usunąć symbole Objective-C z binariów OS X?
Mam pojedynczy plik binarny, który jest pakietem. Jest przeznaczony do użycia jako wtyczka VST lub wtyczka AudioUnit. Chodzi o to, że plik binarny zawiera wszystkie punkty wejściowe dla obu formatów, a kompiluje się je tylko raz, a następnie nazywa jedną kopię za pomocą ".vst" dla wersji VST i ".component" dla wersji AU . (To jest za pomocą ramy Juce BTW.)
Problem polega na tym, że po stronie AU, trzeba wyeksportować klasy Obj-C dla tworzenia widoku Cocoa UI
. Po stronie VST ta klasa nigdy nie będzie używana. Ale jeśli masz hosta takiego jak Ableton Live, który umożliwia jednoczesne ładowanie obu wersji AU i VST tej samej wtyczki, teraz natrafiamy na typowy problem kolizji przestrzeni nazw Obj-C.
Po stronie VST ta konkretna klasa Obj-C nigdy nie będzie używana. Więc chciałbym usunąć te klasy Obj-C z wynikowego pliku binarnego za pomocą "paska". Wciąż ma tę zaletę, że kompiluje wszystko raz dla obu formatów.
W każdym razie próbowałem używać "strip -R stripfile.txt <path to binary>"
, gdzie stripfile.txt zawiera symbole, które chcę usunąć, ale zawsze kończy się niepowodzeniem, mówiąc, że symbole nie mogą być znalezione w pliku binarnym. Próbowałem próbować wymazać nazwy w pliku paska, ale to nie pomaga (lub robię to źle).
Oto odnośne symbole, które chcę się rozebrać, jako wyjście przez "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
jakieś pomysły?
BTW, byłem w stanie dynamicznie zarejestrować daną klasę (używając unikalnej nazwy), co również rozwiązało problem. Jednakże, gdybym mógł uzyskać działanie taśmy, mógłbym potencjalnie wdrożyć rozwiązanie dla już istniejących plików binarnych w terenie.
po prostu nie kompiluj i nie łącz ich w interfejsie AU/VST - zamiast tego ustaw więcej celów. – justin
Wiem, że mogę to zrobić, i tak jak już wspomniałem, mam już działa poprzez dynamiczną rejestrację danej klasy, co jest przyjemniejsze, ponieważ nadal pozwala kompilować wszystko raz i nie mieć oddzielnych celów/plików binarnych - wynikowy plik binarny może nadal mogą być używane jako AU lub VST (nie można tego zrobić za pomocą metody "nie-kompiluj-to-za-VST"). Wciąż jestem ciekawy, czy istnieje sposób na pozbycie się binariów Obj-C z istniejących plików binarnych, ponieważ pozwoliłoby to naprawić istniejące instalacje w polu, zanim moja "lepsza" poprawka będzie gotowa do wysłania. – jimw
Usunięcie symboli nie spowodowałoby usunięcia struktur klas, więc prawdopodobnie nie uniemożliwiłoby załadowania klasy (nie wiem, w jaki sposób środowisko wykonawcze znajduje klasy, ale wyszukiwanie symboli byłoby trudniejsze niż przeglądanie sekcji, która jest zarezerwowana dla informacji o klasie). Możesz spróbować zmienić nazwę klasy w pliku binarnym, ale musisz uważać, aby nie wpłynąć na nic innego. Zgodziłbym się z Justinem, że kompilowanie dwa razy to najlepszy wybór, ponieważ jest to łatwiejsze niż dynamiczna rejestracja. – ughoavgfhw