LINUX.ORG.RU

Как удалить мертвый код при статической линковке (gcc)


1

1

Я почему-то думал, что если в С подключаешь библиотеку (в исходных кодах), из которой используешь одну функцию, то только та функция и войдёт в итоговый elf. Однако опытно узнал, что нет — включается библиотека целиком.

Как насильно заставить gcc не подключать мертвый код?



Последнее исправление: meduza (всего исправлений: 1)

Ну ты даешь, конечно же такого не будет. Я лично в отдельный исходник кидал нужные мне функции, может, есть еще какой способ

ms-dos32
()
#include <iostream>

int main()
{
  std::cout << "hi\n";
}
del@del-lmde ~ $ ls /usr/lib/gcc/x86_64-linux-gnu/4.6.3/libgcc -lh
libgcc.a        libgcc_eh.a     libgcc_s_32.so  libgcc_s.so     
del@del-lmde ~ $ ls /usr/lib/gcc/x86_64-linux-gnu/4.6.3/libgcc.a -lh
-rw-r--r-- 1 root root 3.0M Mar  1 23:38 /usr/lib/gcc/x86_64-linux-gnu/4.6.3/libgcc.a
del@del-lmde ~ $ g++ -Wl,--gc-sections,-static -static-libgcc -static-libstdc++ test_static.cpp -o test_static1
del@del-lmde ~ $ ls -lh test_static1 
-rwxr-xr-x 1 del del 367K Jun  3 14:18 test_static1
del@del-lmde ~ $ g++ -static-libgcc -static-libstdc++ test_static.cpp -o test_static2
del@del-lmde ~ $ ls -lh $_
-rwxr-xr-x 1 del del 695K Jun  3 14:19 test_static2

Опция --print-gc-sections у ld покажет тебе, что оно удаляет.

DELIRIUM ☆☆☆☆☆
()

Нашёл решение

CFLAGS += -fdata-sections -ffunction-sections
LDFLAGS += -Wl,--gc-sections

Интересно, почему это само не включается при -Os?

meduza
() автор топика
Ответ на: комментарий от gentoo_root

Ответ не правильный. Почитай спеки GCC, например про -pthread

gcc -dumpspecs

r2d2
()

А что если эта функция внутри обращается в другим функциям библиотеки, которые ты отрежешь?

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Раз на них есть ссылки, линкер их не отрежет.

meduza
() автор топика
Ответ на: комментарий от meduza

Это немного другое.

Это именно то: линкуются только те объекты и архива lib*.a, которые реально используются, в случае динамических библиотек (lib*.so) линкуются только те библиотеки из всего списка, символы из которых реально используются.

anonymous
()
Ответ на: комментарий от anonymous

Прочитайте первое сообщение.

ПЫСЫ. Под библиотекой я имел в виду не только *.a, но и *.o.

meduza
() автор топика
Ответ на: комментарий от LongLiveUbuntu

Это проблемы автотулза и того, кто его использует. Какое это имеет отношение к теме? В любом случае низкоуровневая оптимизация и переносимость почти всегда альтернативы, причём выбор очевиден в каждом конкретном случае.

meduza
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.