Ограничить количество экспортируемых из .so функций
От: SergH Россия  
Дата: 18.09.12 13:22
Оценка:
Привет,

пишу либу, насколько я понимаю, по умолчанию в экспорт попадает всё, что не объявлено как static. Можно как-то оставить только нужное, а служебные функции убрать?
Делай что должно, и будь что будет
Re: Ограничить количество экспортируемых из .so функций
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.09.12 16:42
Оценка: 7 (1)
Здравствуйте, SergH, Вы писали:

SH>пишу либу, насколько я понимаю, по умолчанию в экспорт попадает всё, что не объявлено как static. Можно как-то оставить только нужное, а служебные функции убрать?


Linker script позволяет сделать такое (подразумеваем, что используется GNU ld).
The God is real, unless declared integer.
Re: Ограничить количество экспортируемых из .so функций
От: ДимДимыч Украина http://klug.org.ua
Дата: 18.09.12 17:04
Оценка: 14 (1) -1
Здравствуйте, SergH, Вы писали:

SH>Можно как-то оставить только нужное, а служебные функции убрать?


man strip
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re: Ограничить количество экспортируемых из .so функций
От: b-3 Россия  
Дата: 18.09.12 17:17
Оценка: 24 (2)
Здравствуйте, SergH, Вы писали:

SH>пишу либу, насколько я понимаю, по умолчанию в экспорт попадает всё, что не объявлено как static. Можно как-то оставить только нужное, а служебные функции убрать?


Если пишете на GCC, то делайте так: http://gcc.gnu.org/wiki/Visibility

Вкратце — -fvisibility=hidden в параметры компилятора и
#define DLL_PUBLIC __attribute__ ((visibility ("default")))

// ...
extern void public_foo() DLL_PUBLIC; // экспортируемая функция
extern void private_foo(); // приватная функция
Забанен с формулировкой "клинический дисидент".
Re[2]: Ограничить количество экспортируемых из .so функций
От: SergH Россия  
Дата: 19.09.12 11:53
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>man strip


спасибо, не знал, использовал только для удаления локальных и отладочных.
но не очень удобно вытаскивать это в сборку, хотелось бы прямо в коде пометить, что нужно вытащить наружу, а что нет.
Делай что должно, и будь что будет
Re[2]: Ограничить количество экспортируемых из .so функций
От: SergH Россия  
Дата: 19.09.12 11:54
Оценка:
Здравствуйте, b-3, Вы писали:

b-3>Если пишете на GCC, то делайте так: http://gcc.gnu.org/wiki/Visibility


То что надо, спасибо!
Делай что должно, и будь что будет
Re[2]: Ограничить количество экспортируемых из .so функций
От: SergH Россия  
Дата: 19.09.12 11:56
Оценка:
Здравствуйте, netch80, Вы писали:

N>Linker script позволяет сделать такое (подразумеваем, что используется GNU ld).


Насколько я понимаю, он позволяет вообще всё что угодно сделать
Слишком сильное средство, имхо, тем более, нашлось хорошее решение.
Делай что должно, и будь что будет
Re[3]: Ограничить количество экспортируемых из .so функций
От: Centaur Россия  
Дата: 19.09.12 12:03
Оценка:
Здравствуйте, SergH, Вы писали:

SH>но не очень удобно вытаскивать это в сборку, хотелось бы прямо в коде пометить, что нужно вытащить наружу, а что нет.


В коде это отлично помечается static’ом.
Re[4]: Ограничить количество экспортируемых из .so функций
От: SergH Россия  
Дата: 19.09.12 12:05
Оценка: +1
Здравствуйте, Centaur, Вы писали:

C>В коде это отлично помечается static’ом.


Не получается, если либа состоит из нескольких с-файлов и не все их не-статик функции должны торчать наружу.
Делай что должно, и будь что будет
Re: Ограничить количество экспортируемых из .so функций
От: Pzz Россия https://github.com/alexpevzner
Дата: 19.09.12 12:12
Оценка:
Здравствуйте, SergH, Вы писали:

SH>пишу либу, насколько я понимаю, по умолчанию в экспорт попадает всё, что не объявлено как static. Можно как-то оставить только нужное, а служебные функции убрать?


Почитайте тугаментацию GNU ld на предмет version script'ов.

В простейшем случае такой скрипт выглядит очень просто:

{
  global:
    symbol1;
    symbol2;
    ...

  local:
    *;
}


Такой скрипт можно подсунуть линкеру либо через LD script (чего вы вряд ли хотите), либо опцией --version-script

Если вы используете autotools с libtool, то они несколько упрощают эту задачу: достаточно создать текстовый файл с перечислением символов, которые вы собираетесь проэкспортировать, и добавить в LDFLAGS опцию -export-symbols с именем этого файла.
Re[3]: Ограничить количество экспортируемых из .so функций
От: MescalitoPeyot Украина  
Дата: 04.10.12 20:43
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, b-3, Вы писали:


b-3>>Если пишете на GCC, то делайте так: http://gcc.gnu.org/wiki/Visibility


SH>То что надо, спасибо!


Только учтите, что публичными все равно остануться:
а) то что нужно для RTTI (typeinfo)
б) проинстанцированное из STL (включая, например, что-то в духе std::auto_ptr<MySecureLicenseCheckerThatIdontExportAndHideHahaha>::auto_ptr()) т. к. они принудительно в хидерах libstdc++ объявлены как пабликовые.

Как (просто и без извращений) бороться с первым не знаю, а для того чтобы скрыть второе я в свое время просто патчил хидеры libstdc++, там одна строчка.
Re[4]: Ограничить количество экспортируемых из .so функций
От: SergH Россия  
Дата: 04.10.12 21:06
Оценка:
Здравствуйте, MescalitoPeyot, Вы писали:

MP>Только учтите, что публичными все равно остануться:

MP>а) то что нужно для RTTI (typeinfo)
MP>б) проинстанцированное из STL (включая, например, что-то в духе std::auto_ptr<MySecureLicenseCheckerThatIdontExportAndHideHahaha>::auto_ptr()) т. к. они принудительно в хидерах libstdc++ объявлены как пабликовые.

MP>Как (просто и без извращений) бороться с первым не знаю, а для того чтобы скрыть второе я в свое время просто патчил хидеры libstdc++, там одна строчка.


Спасибо, буду знать.
Но в данном случае у меня чистый С, так что это не проблема.
Делай что должно, и будь что будет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.