Не представляйте символы из библиотеки, которой пользуются, в собственной статической библиотеке

Будет Dropbox ( http://www.getdropbox.com/ ) делает то, что Вы хотите?

15
задан Jaka Jančar 22 October 2009 в 08:08
поделиться

2 ответа

Вы можете переименовать весь экспортированный символ из 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.

10
ответ дан 1 December 2019 в 04:34
поделиться

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

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

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

4
ответ дан 1 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: