Страницы

Поиск по вопросам

воскресенье, 14 апреля 2019 г.

С (GCC). Как исключить из сборки неиспользуемые функции?

В проекте есть пара .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 Но это не всегда приемлемо особенно когда это касается больших проектов. Пример

Комментариев нет:

Отправить комментарий