Я хочу проанализировать, что вызывает огромный размер моей общей библиотеки C++, которая скомпилирована GCC (v.6.1.1) в Linux.Анализ символов на C++: как определить, какая статическая инициализация выполняется?
readelf -sW libfoo.so
говорит мне, что особенно большие функции, вызываемые __static_initialization_and_destruction_0
, например:
000000000026c420 10272 FUNC LOCAL DEFAULT 12 __static_initialization_and_destruction_0(int, int) [clone .constprop.1774]
Я добавил -Wl,-Map,foo.map
в CXX
флаги для создания файла компоновщик карты. Цель 0x000000000026c420
в том, что файл карты урожайности:
.text.startup 0x000000000026c420 0x2825 CMakeFiles/foo.dir/bar.cpp.o
Так что теперь я знаю, что bar.cpp
является ЕП, который вызывает статическую инициализацию, но сказал, что файл не содержит каких-либо static
переменные. Однако он включает множество заголовков.
Как узнать, какие переменные статически инициализируются в этих функциях?
Вы, вероятно, использовать _ # _ включают, который определяет 'статическую ios_base :: Init __ioinit;'. –
Viatorus