2009-10-21 3 views
13

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

Я хочу использовать minizip в своей библиотеке внутри, но не хочу раскрывать ее пользователю.

Должно быть возможно, чтобы пользователь включил мини-диск самостоятельно, возможно, другую версию, а не вызывал столкновения с моей «внутренней» версией мини-диска.

Возможно ли это?

Edit:

Я попытался добавить -fvisibility=hidden дополнительные флаги компилятора для minizip файлов и изменение функций быть __private_extern__ и __attribute__((visibility("hidden"))), но она по-прежнему кажется, производит определенные внешние символы:

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

Редакция № 2:

По-видимому, обозначенные символами символы нотации, которые никогда не происходят, когда Xcode создает источники, поскольку он добавляет параметр -c («Скомпилировать или собрать исходные файлы, но не ссылаться».)

+0

Можете ли вы/хотите изменить внутреннюю копию мини-диска, а поддерживает ли iPhone двухуровневое пространство имен символов Mach-O? Я ожидаю, что ответ на оба должен быть да. – ephemient

+0

Я готов изменить свою копию, конечно. Может быть, я мог бы просто иметь все символы, предварительно добавленные с префиксом, который я использую для своей библиотеки, каким-то образом?Я бы не прочь сделать my_ <имя пользователя minizip func>. Я не знаю, поддерживаются ли двумерные пространства имен символов на iPhone. –

+1

Просто для будущего Googler's, вы можете увидеть это, это может быть полезно: http://stackoverflow.com/a/14863432/311567 – dashesy

ответ

-1

Вы хотите, чтобы взгляните на Dynamic Library Programming Topics, в частности раздел Symbol Exporting Strategies и опцию gcc -exported_symbols_listFILE.

+1

Не проблема с тем, что они обсуждают динамические библиотеки (разделяемые библиотеки), а скорее чем статические библиотеки? –

+0

OP работает со статическими библиотеками, и в этом случае стратегии экспорта символов не применяются –

10

Вы можете переименовать весь экспортированный символ из minizip с objcopy.

что-то вроде

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

и minizip.syms

_unzOpen  _yourownprefix_unzOpen 
_unzOpen2 _yourownprefix_unzOpen2 
...   ... 

Нет коллизий, если исполняемый файл связан с другим minizip.a и yourstaticlibray.a, а потому, что вы переименовали все символ в yourstaticlibray.a ваш звонок внутри yourstaticlibray.a в minizip будет использовать префиксный символ, а не unzOpen.

+0

objdump, похоже, недоступен в Mac OS X:/ –

+0

Кроме того, это не 'objdump', а' objcopy' ... Я исправлю мой ответ. – Nimlar

+0

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

4

Поскольку статическая библиотека представляет собой не что иное, как набор файлов .o (которые еще не связаны, как вы уже упоминали), единственный способ полностью скрыть присутствие minizip из внешнего мира - это как-то скомпилировать minizip и ваш библиотеки вместе как единый блок компиляции и сделать minizip функции/переменные статическими.

Вы можете посмотреть, как SQLite выполняет процесс «объединения», который превращает исходный код библиотеки в один .c-файл для дальнейшей компиляции: The SQLite Amalgamation.

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

+0

Вы на правильном пути, но вам не нужно испытывать боль от слияния в единый блок компиляции, поскольку средство компоновщика Xcode может выполнять «предварительную линию с одним объектом» «добиться того же результата после компиляции и архивирования. См. Http://stackoverflow.com/a/18949281/316487. – bleater

Смежные вопросы