Как оптимизировать размер разделяемой библиотеки?

Допустим, у нас есть огромные статические библиотеки с множеством ненужных функций (в приведенном ниже примере у нас есть библиотеки lib1.a и lib2.a ] с ненужными функциями g1 () и f2 () ).

Мы хотим создать разделяемую библиотеку с несколькими экспортированными методами, которые используют только несколько функций / классов из этих огромных библиотек. См. Пример ниже: мы хотим экспортировать функцию foo () .

ВОПРОСЫ

  1. Можем ли мы сообщить компоновщику ( ld ), какие функции / методы мы хотим экспортировать (как мы делаем это для DLL в Windows)?
  2. Может ли компоновщик разрешать зависимости и удалять ненужные функции / методы? Или есть другой способ решить проблему?
  3. Если у вас есть решение, напишите, пожалуйста, исправления для примера ниже.

ПРИМЕР

Файл 1.h :

int f1( int n );
int g1( int n );

Файл 2.h :

int f2( int n );

Файл foo.cpp :

#include "1.h"
#include "2.h"

int foo( int n )
{
    return f1( n );
}

Файл 1.cpp :

int f1( int n ) { return n; }
int g1( int n ) { return n; }

Файл 2.cpp :

int f2( int n ) { return n; }

Файл makefile :

CXXFLAGS = -g -I. -Wall -Wno-sign-compare

all: prepare libFoo.so

clean:
    rm -f obj/*.a obj/*.o res/*.so

prepare:
    mkdir -p src
    mkdir -p obj
    mkdir -p res

lib1.a lib2.a: lib%.a: %.o
    ar r obj/$@ obj/$*.o

1.o 2.o foo.o: %.o:
    g++ $(CXXFLAGS) -c -o obj/$@ src/$*.cpp

libFoo.so: lib1.a lib2.a foo.o
    ld -shared -o res/libFoo.so obj/foo.o -Lobj -l1 -l2

И после создания цели all у нас есть nm res / libFoo.so :

...
000001d8 T _Z2f1i
0000020e T _Z2g1i
000001c4 T _Z3fooi
...

Итак, ld имеет удален объектный файл 2.o в соответствии с зависимостями между объектными файлами. Но не удалила функцию g1 () из 1.o .

11
задан bmargulies 5 November 2011 в 17:39
поделиться