В проекте есть пара .c / .h, в которой объявлены и определены несколько функций. При этом некоторые из них не используются. Но после компиляции, заглянув в листинг можно обнаружить там ассемблерный код этих самых неиспользуемых функций? Как исключить их из сборки? В моем случае память очень ограничена и хотелось бы оптимально ее расходовать. Да и вообще интересно. К тому же, не попадают же таким образом неиспользуемые ф-ии из стандартной библиотеки.
Ответ
Итак давайте разбираться, на этапе компиляции понятное дело что функции вряд-ли куда денутся, все они окажутся в объектном файле, следовательно все дело в сборке (linking).
Создадим пример:
/* Файл func1.c */
int FuncA (void) { return 1; } /* ни где не используется */
int FuncB (void) { return 2; } /* ни где не используется */
/* Файл func2.c */
int FuncC (void) { return 0; } /* используется в main() */
/* Файл func1.h */
int FuncA (void);
int FuncB (void);
/* Файл func2.h */
int FuncC (void);
/* Файл main.c */
#include "func1.h"
#include "func2.h"
int main(int argc, char **argv) { return FuncC(); }
Теперь начинаем собирать:
gcc -o a.out main.c func1.c func2.c
Проверяем:
nm a.out | grep Func[ABC]
080483c4 T FuncA
080483ce T FuncB
080483d8 T FuncC
Ничего не получилось :-)
Делаем еще одну попытку:
gcc -c func1.c
gcc -c func2.c
gcc -o a.out main.c func1.o func2.o
Проверяем:
nm a.out | grep Func[ABC]
080483c4 T FuncA
080483ce T FuncB
080483d8 T FuncC
Опять все функции попали в выходной файл.
Применяем черную магию, а конкретно собираем библиотеку:
gcc -c func1.c
gcc -c func2.c
ar rcs lib.a func1.o func2.o
gcc -o main.c lib.a
Проверяем:
nm a.out | grep Func[ABC]
080483c4 T FuncC
Итак у нас получилось.
Отсюда вывод - разделяем исходняки на модули затем компилируем модули в объектные файлы, затем объектные файлы объединяем в библиотеку, а затем собираем основную программу с библиотеками подключатся только используемые модули
UPDATE
У gcc-шного линкера есть такая возможность как -gc-sections (garbage collect and discard unused sections), воспользоваться ею легко:
gcc -fdata-sections -ffunction-sections -Wl,--gc-sections -o a.out \
main.c func1.c func2.c
nm a.out | grep Func[ABC]
080483c0 T FuncC
Но это не всегда приемлемо особенно когда это касается больших проектов. Пример
Комментариев нет:
Отправить комментарий