LINUX.ORG.RU

Слишком большой размер файла библиотеки (shared object)


0

0

Здравствуйте. Я написал на C++ портируемую библиотеку - специфический сетевой стек. Итерфейс стека предоставляет всего полтора десятка C-фунций. При компиляции с помощью g++ с опцией -shared эксопртируются все определённые в коде функции о объекты. По приблизительной оценки утилиами objdump и nm выходит, что эспортируемые символы занимают треть файла .so. Вопрос такой: как указать g++ и ld экспоритровать только функции, предоставляемые интерфейсом, плюс только самые необходимые для работы .so файла? Под win32 это решается либо с помощью .def файла, либо с помощью директивы компилятора __declspec(dllexport). Можно это сделать на g++? Для меня весьма критичен размер .so файла. g++ версии: 3.2 и 2.96.

ну - можно либу стрипнуть objcopy --strip-debug lib.so,

а если хочешь выкинуть ненужные функции - то тут 2 пути. 1. выброси их из исходников :) 2. при сборке используй скрипт для ld в котором обьяви нужные функции как extern

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

К сожалению, objcopy не помогает, я думаю, он делает то же, что и strip -s. А вот за совет про скрипт - спасибо. Придётся изучить и попробовать. Может кто скинет пример на мыло? Очень удручает, что .so занимает 970КБ, когда то же самое в .dll занимает 295КБ и сжатое утилитой ASPack - 130КБ. У заказчика, мягко говоря, недовольство таким положением.

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

To SadStork

Прошу прощения. Думал, в профайле видно. Мыло: sergio_nsk@yahoo.de

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

Re to SadStork

Спасибо за ссылку. К сожалению, помещение интерфейсных функций в команду скрипта EXTERN(func) нужных результатов не дало. Возможно у меня клинический случай, но опция -shared не спрашивая помещает все функций, не объявленные как static, в секцию .text. Я даже написал простой тест test.c с тремя фунциями func1, static func2 и func3, и независимо от команды EXTERN func1 и func3 всегда оказывались в .text. Да, еще: у меня нет скриптов в /usr/lib/ldscripts и вообще нигде нет. Я раздобыл скрипты вот так: ld --verbose > elf_i386.xs и ld -shared --verbose > elf_i386.xs.

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