LINUX.ORG.RU

Скрыть «внутренние символы» в статической библиотеке

 


0

4

Допустим, есть некая библиотека, использующая внутри себя патченный libcrypto. Если бы речь шла о динамической библиотеке, все просто: компилируем libcrypto с PIC, линкуемся с шаренной библиотекой, скрывая ненужные символы через linker script. А если такой же трюк требует провернуть для статической библиотеки?

Пример для наглядности: берем SHA1_Init(SHA_CTX *c), добавляем ей какой-нибудь параметр int SHA1_Init(SHA_CTX *c, int param), собираем libcrypto.a ну и свою libyoba.a. Далее, если положить все (или только нужные) объектные файлы или libcrypto.a в libyoba.a, то при линковке с yoba с приложением, использующим SHA1_Init, в зависимости от порядка -lyoba -lcrypto, все результирущее приложение получит либо патченный SHA1_Init, либо его оригинальную версию. А хотелось бы, чтобы патченный SHA1_Init оставался исключительно внутри libyoba.a.

Понимаю, что это решается банальным переименованием, но уж больно много всего переименовывать в libcrypto придется.

Насколько я знаю, линкер статические библиотеки считает тупо архивами объектников, а не самостоятельными сущностями. Так что у них нет экспортов-импортов и видимости, как у shared objects, и линкуются они кучей вместе с остальными объектниками.

Может, поставлять libyoba+crypto как самостоятельную комбинированную либу, к которой совершенно случайно подходят инклюды от OpenSSL?

ilammy ★★★
()
Ответ на: комментарий от ilammy

Тогда, может быть, есть какой-то грязный трюк, чтобы из yoba.o + libcrypto получить yoba+libcrypto.o, в котором ничего из libcrypto не светится наружу?

kawaii_neko ★★★★
() автор топика
Ответ на: комментарий от kawaii_neko

Если на выходе только один .o, то линкуете (ld -r obj.o libs...), а потом ojbcopy оставляете только нужные символы для экспорта.

vodz ★★★★★
()

при линковке с yoba с приложением, использующим SHA1_Init, в зависимости от порядка -lyoba -lcrypto, все результирущее приложение получит либо патченный SHA1_Init, либо его оригинальную версию.

-lcrypto - это же для динамики? Из статических библиотек просто берется кусок кода и склеивается в конечную программу. Вроде такого

$ gcc  glfw_test.c -I../include ../libgl3w.a -lglfw -ldl

А хотелось бы, чтобы патченный SHA1_Init оставался исключительно внутри libyoba.a.

По-моему, статические библиотеки так не работают. Динамика и LD_PRELOAD

panzerito
()
Последнее исправление: panzerito (всего исправлений: 2)

Чтобы поменять торчащие наружу символы, можно использовать --redefine-syms из objcopy

А еще есть вот это http://www.agner.org/optimize/#objconv

This utility can be used for converting object files between COFF/PE, OMF, ELF and Mach-O formats for all 32-bit and 64-bit x86 platforms. Can modify symbol names in object files.

Правда я им никогда не пользовался

SZT ★★★★★
()
Ответ на: комментарий от panzerito

Это не вопрос «Как удалить символы в obj/elf с помощью objcopy/strip?»

Не совсем. До последнего теплилась надежда, что удастся положить пачку объектников, в т. ч. и от libcrypto в свой archive, но, видимо, придется прилинковывать их в свои объектные файлы.

kawaii_neko ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.