Контекст: У меня есть программа, которая передает исполняемый файл по сети. Этот исполняемый файл слишком большой, поэтому я запустил ldd -u bigFoo.so
на связанный с ним общий объект. Это показало, что у меня было большое количество неиспользуемых общих объектных файлов, которые занимали концерт.
Вопрос: Данный кусок исходного кода C ++ foo.cc
который составлен и связан в bigFoo.so
, а также unused.so
(раскрывается ldd -u
) который связан с bigFoo.so
Есть ли сценарий или последовательность команд оболочки, которые могут быстро определить, какие вызовы в foo.cc
вызвать связь unused.so
?
Перекомпилируйте после добавления опции -Wl,-M
на ваш CXXFLAGS
, Ищи ‘Член архива включен …‘, Следующие строки покажут, какие библиотеки включены в файл, и какие функции их запрашивают.
Пример:
gcc -std=gnu99 -O0 -Wall -Wextra -Wunused -Wl,-M -c showmmap.c -o showmmap.o
gcc -std=gnu99 -O0 -Wall -Wextra -Wunused -Wl,-M showmmap.o -o showmmap
Archive member included to satisfy reference by file (symbol)
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o (__libc_csu_init)
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(fstat.oS)
showmmap.o (fstat)
Discarded input sections
--------8<--snip--->8-----
Мне пришлось копаться в моих архивах, чтобы найти что-то, что тянуло в других библиотеках. В этом примере вы можете увидеть, что __libc_csu_init а также fstat являются функциями, которые запрашивали включение других участников архива.
Выход из -Wl,-M
вариант довольно … объемный, обязательно передайте вывод в файл или через less
То, что я показал здесь, это всего лишь небольшой фрагмент из самой главы. Ваш вывод должен быть длиннее, учитывая, что вы, вероятно, включили много библиотечных подпрограмм.