2009-10-21 11 views
13

Piszę bibliotekę statyczną wielokrotnego użytku dla iPhone'a, postępując zgodnie z instrukcjami podanymi pod numerem here.Nie wolno ujawniać symboli z używanej biblioteki we własnej bibliotece statycznej.

Chcę używać w bibliotece wewnętrznej biblioteki minizip, ale nie chcę ujawniać jej użytkownikowi.

Użytkownik powinien mieć możliwość dołączenia minizipu, ewentualnie innej wersji, i nie powodować konfliktów z moją "wewnętrzną" wersją minizipu.

Czy to możliwe?

Edit:

Próbowałem dodanie -fvisibility=hidden dodatkowych flag kompilatora dla plików minizip i zmianę funkcji będzie __private_extern__ i __attribute__((visibility("hidden"))), ale wciąż wydaje się produkować określone symbole zewnętrzne:

00000918 T _unzOpen 
0000058e T _unzOpen2 
00001d06 T _unzOpenCurrentFile 
00001d6b T _unzOpenCurrentFile2 
... 

Edytuj nr 2:

Podobno symbole oznaczone tymi notacje są prywatne tylko przez linker, co nigdy nie zdarza się, gdy Xcode tworzy źródła, ponieważ dodaje parametr -c ("Kompiluj lub montuj pliki źródłowe, ale nie łącz")

+0

Czy jesteś w stanie/chcesz zmodyfikować swoją wewnętrzną kopię minizipu i czy iPhone obsługuje dwupoziomowy obszar nazw Mach-O? Oczekuję, że odpowiedź na oba pytania będzie twierdząca. – ephemient

+0

Jestem skłonny zmodyfikować moją kopię, jasne. Może mógłbym po prostu mieć wszystkie symbole z prefiksem, którego używam do mojej biblioteki?Nie miałbym nic przeciwko wykonaniu my_ . Nie wiem, czy dwupoziomowe przestrzenie nazw symboli są obsługiwane w telefonie iPhone. –

+1

Tylko dla przyszłego Googlera, może chcesz to zobaczyć, może to być pomocne: http://stackoverflow.com/a/14863432/311567 – dashesy

Odpowiedz

-1

Będziesz chciał spójrz na Dynamic Library Programming Topics, w szczególności sekcję Symbol Exporting Strategies i opcję gcc -exported_symbols_listFILE.

+1

Czy to nie kłopot z tymi, które omawiają biblioteki dynamiczne (biblioteki współdzielone), a nie niż statyczne biblioteki? –

+0

OP zajmuje się bibliotekami statycznymi, w których przypadku strategie eksportowania symboli nie obowiązują –

10

Można zmienić nazwę całego eksportowanego symbolu z minizip za pomocą objcopy.

coś

objcopy -redefine-sym=minizip.syms yourstaticlibray.a 

i minizip.syms

_unzOpen  _yourownprefix_unzOpen 
_unzOpen2 _yourownprefix_unzOpen2 
...   ... 

Nie clash jeśli plik wykonywalny jest powiązany z innym minizip.a i yourstaticlibray.a i dlatego zmieniono nazwę cały symbol yourstaticlibray.a rozmowy wewnątrz yourstaticlibray.a do minizip użyje prefiksowanego symbolu, a nie unzOpen.

+0

objdump nie wydaje się być dostępny na Mac OS X:/ –

+0

Co więcej nie jest to "objdump", ale "objcopy" ... poprawię moja odpowiedź. – Nimlar

+0

@ JakaJančar $ brew install binutils && gobjdump – FGRibreau

4

Ponieważ biblioteka statyczna to nic innego jak zbiór plików .o (które nie są jeszcze połączone, jak już wspomniano), jedynym sposobem całkowitego ukrycia obecności minizipu ze świata zewnętrznego jest jakoś skompilowanie minizipu i biblioteka razem jako jedna jednostka kompilacji i sprawiają, że funkcje/zmienne minizip są statyczne.

Można się przyjrzeć, w jaki sposób SQLite przeprowadza proces "łączenia", który zamienia kod źródłowy biblioteki na pojedynczy plik .c w celu dalszej kompilacji: The SQLite Amalgamation.

Jako bonus otrzymasz lepszą optymalizację (naprawdę najnowsze GCC i Binutils są w stanie dokonać optymalizacji czasu łącza, ale ta funkcja nie jest jeszcze dostępna).

+0

Jesteś na dobrej drodze, ale nie musisz przechodzić przez ból łączenia się w jedną jednostkę kompilacji, ponieważ linker narzędzia Xcode może wykonać "prelinkowanie pojedynczego obiektu" "aby osiągnąć ten sam wynik po kompilacji i archiwizacji. Zobacz http://stackoverflow.com/a/18949281/316487. – bleater

Powiązane problemy