Скрипт, чтобы быстро определить, какой исходный код вызывает ненужные ссылки .so

Контекст: У меня есть программа, которая передает исполняемый файл по сети. Этот исполняемый файл слишком большой, поэтому я запустил ldd -u bigFoo.so на связанный с ним общий объект. Это показало, что у меня было большое количество неиспользуемых общих объектных файлов, которые занимали концерт.

Вопрос: Данный кусок исходного кода C ++ foo.cc который составлен и связан в bigFoo.so, а также unused.so (раскрывается ldd -u) который связан с bigFoo.soЕсть ли сценарий или последовательность команд оболочки, которые могут быстро определить, какие вызовы в foo.cc вызвать связь unused.so?

1

Решение

Перекомпилируйте после добавления опции -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

То, что я показал здесь, это всего лишь небольшой фрагмент из самой главы. Ваш вывод должен быть длиннее, учитывая, что вы, вероятно, включили много библиотечных подпрограмм.

1

Другие решения