Удаление общих библиотек Linux

Мы'Недавно нас попросили отправить версию Linux для одной из наших библиотек, ранее мыМы разработали для Linux и поставляем для Windows, где развертывание библиотек, как правило, намного проще. Проблема, которую мыМы имеем дело с разделением экспортированных символов до тех, которые находятся в открытом интерфейсе. Есть три веские причины для этого

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

Возьмем простой пример:

test.cpp

#include 

float private_function(float f)
{
    return std::abs(f);
}

extern "C" float public_function(float f)
{
    return private_function(f);
}

скомпилировано с (g ++ 4.3.2, ld 2.18.93.20081009)

g++ -shared -o libtest.so test.cpp -s

и проверять символы с

nm -DC libtest.so

дает

         w _Jv_RegisterClasses
0000047c T private_function(float)
000004ba W std::abs(float)
0000200c A __bss_start
         w __cxa_finalize
         w __gmon_start__
0000200c A _edata
00002014 A _end
00000508 T _fini
00000358 T _init
0000049b T public_function

явно неадекватный. Итак, затем мы переименуем публичную функцию как

extern "C" float __attribute__ ((visibility ("default"))) 
    public_function(float f)

и скомпилировать с

g++ -shared -o libtest.so test.cpp -s -fvisibility=hidden

который дает

         w _Jv_RegisterClasses
0000047a W std::abs(float)
0000200c A __bss_start
         w __cxa_finalize
         w __gmon_start__
0000200c A _edata
00002014 A _end
000004c8 T _fini
00000320 T _init
0000045b T public_function

что хорошо, за исключением того, что выставлен std :: abs. Более проблематично, когда мы начинаем связывать другие (статические) библиотеки вне нашего контроля,все символы, которые мы используем из этих библиотек, экспортируются, Кроме того, когда мы начинаем использовать контейнеры STL:

#include 
struct private_struct
{
    float f;
};

void other_private_function()
{
    std::vector v;
}

мы получаем много дополнительных экспортов из библиотеки C ++

00000b30 W __gnu_cxx::new_allocator::deallocate(private_struct*, unsigned int)
00000abe W __gnu_cxx::new_allocator::new_allocator()
00000a90 W __gnu_cxx::new_allocator::~new_allocator()
00000ac4 W std::allocator::allocator()
00000a96 W std::allocator::~allocator()
00000ad8 W std::_Vector_base::_Vector_impl::_Vector_impl()
00000aaa W std::_Vector_base::_Vector_impl::~_Vector_impl()
00000b44 W std::_Vector_base::_M_deallocate(private_struct*, unsigned int)
00000a68 W std::_Vector_base::_M_get_Tp_allocator()
00000b08 W std::_Vector_base::_Vector_base()
00000b6e W std::_Vector_base::~_Vector_base()
00000b1c W std::vector::vector()
00000bb2 W std::vector::~vector()

NB: с оптимизмом на васВам нужно убедиться, что вектор действительно используется, чтобы компилятор неоптимизировать неиспользуемые символы.

Я полагаю, что мой коллега сумел создать специальное решение, включающее файлы версий и изменение заголовков STL (!), Которое, кажется, работает, но я хотел бы спросить:

Есть ли чистый способ убрать все ненужные символы (т.е. те, которые не являются частью предоставляемой библиотеки функциональности) из общей библиотеки linux? Я'я пробовал довольно много опций для g ++ и ld без особого успеха, поэтому яЯ предпочел бы ответы, которые, как известно, работают, а не верят.

Особенно:

Символы из статических библиотек (с закрытым исходным кодом) не экспортируются.Символы из стандартной библиотеки не экспортируются.Непубличные символы из объектных файлов не экспортируются.

Наш экспортированный интерфейс - C.I '

Я знаю о других подобных вопросах по SO:

НЕ делить все классы с общей библиотекойКак ДЕЙСТВИТЕЛЬНО удалить бинарный файл в MacOsGNU linker: альтернатива --version-script для отображения экспортируемых символов в командной строке?

но имели небольшой успех с ответами.

Ответы на вопрос(5)

Ваш ответ на вопрос