2013-03-05 6 views
12

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.

+6

po prostu nie kompiluj i nie łącz ich w interfejsie AU/VST - zamiast tego ustaw więcej celów. – justin

+1

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

+0

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

Odpowiedz

3

Nie można po prostu usunąć klasy z pliku binarnego. Jedyne, co możesz zrobić, to oszukać środowisko wykonawcze Objective-C w przekonanie, że twoja wtyczka nie zawiera żadnego kodu Objective-C. Po prostu zmień __objc_imageinfo na __objc_imageinfX na przykład w binarnej wersji wtyczki VST. Można to łatwo zrobić z Perl:

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

Po łatanie wtyczki VST, cały inicjalizacji Objective-C zostaną pominięte i nie będzie widać ten komunikat o błędzie: Class JuceDemoProjectAU is implemented in both …/VSTPlugin and …/AUPlugin. One of the two will be used. Which one is undefined.

uważaj, powinieneś naprawdę nie używaj tej sztuczki! Odpowiednim rozwiązaniem problemu jest albo kompilacja dwóch różnych wersji wtyczki, albo dynamiczne rejestrowanie klas, zgodnie z sugestią innych osób.

+0

Z jakiegoś powodu nie byłem w stanie uzyskać tego zbyt działającego, symbole Celu C pozostają w systemie binarnym nawet po wykonaniu polecenia. Ale dobry pomysł, w zasadzie. – Perception

+0

Zapomniałem o tym pamiętać zakłada 64-bitowe wtyczki. W przypadku 32-bitowych wtyczek możesz zamiast tego zmienić '__image_info' na' __image_infX'. – 0xced