Таким образом, основная проблема заключается в том, что мой встроенный исполняемый файл имеет размер 4 ГБ с включенными символами отладки (от 75 МБ до 300 МБ без символов отладки и различными уровнями оптимизации). Как я могу диагностировать/анализировать, откуда берутся все эти символы, и которые являются самыми крупными нарушителями с точки зрения занимающих место? Я нашел несколько вопросов по сокращению неиспутимого исполняемого размера (хотя они не были ужасно освещены), но здесь я в основном занимаюсь уменьшением беспорядка символов отладки. Исполняемый файл настолько велик, что требуется большое количество времени для загрузки всех символов, что затрудняет отладку. Возможно, сокращение наворотов кода является основной задачей, но я сначала хотел бы знать, где расходуется мое 4GB.Сокращение отпечатка отладочных символов (исполняемый файл раздувается до 4 ГБ)
Запуск исполняемого файла через «размер --format = SysV» я получаю следующий вывод:
section size addr
.interp 28 4194872
.note.ABI-tag 32 4194900
.note.gnu.build-id 36 4194932
.gnu.hash 714296 4194968
.dynsym 2728248 4909264
.dynstr 13214041 7637512
.gnu.version 227354 20851554
.gnu.version_r 528 21078912
.rela.dyn 37680 21079440
.rela.plt 15264 21117120
.init 26 21132384
.plt 10192 21132416
.text 25749232 21142608
.fini 9 46891840
.rodata 3089441 46891872
.eh_frame_hdr 584228 49981316
.eh_frame 2574372 50565544
.gcc_except_table 1514577 53139916
.init_array 2152 56753888
.fini_array 8 56756040
.jcr 8 56756048
.data.rel.ro 332264 56756064
.dynamic 992 57088328
.got 704 57089320
.got.plt 5112 57090048
.data 22720 57095168
.bss 1317872 57117888
.comment 44 0
.debug_aranges 2978704 0
.debug_info 278337429 0
.debug_abbrev 1557345 0
.debug_line 13416850 0
.debug_str 3620467085 0
.debug_loc 236168202 0
.debug_ranges 37473728 0
Total 4242540803
, из которого я предполагаю, что мы можем видеть, что «debug_str» занять ~ 3,6 ГБ. Я не знаю, что такое «debug_str» на 100%, но я предполагаю, что они могут буквально быть строковыми именами символов отладки? Так это говорит мне, что искаженные имена моих символов просто безумно большие? Как я могу выяснить, какие из них и исправить?
Я думаю, что я могу как-то что-то сделать с помощью «nm», непосредственно проверяя имена символов, но результат огромен, и я не уверен, как лучше его искать. Существуют ли какие-либо инструменты для такого анализа?
Используемый компилятор был 'C++ (GCC) 4.9.2'. И я думаю, я должен упомянуть, что я работаю в среде Linux.
4Gb всего лишь 512 МБ и, скорее всего, не вызовет никаких проблем. Если бинарный не 4GB ~ 32Gb –
Извините, да, я имею в виду 4 ГБ. т. е. ~ 4e9 байт, как в выводе «размер» –
Даже версия выпуска вашей программы очень велика. Может быть, пришло время подумать о редизайне и разделить программу на несколько (меньших) модулей? Или несколько исполняемых файлов, или один исполняемый файл, и набор небольших разделяемых библиотек? –