Я использую readelf, чтобы выяснить, почему двоичный файл такой большой, но я не уверен в выводе. Или мой двоичный файл связан очень неправильно. Прямо сейчас двоичный файл составляет приблизительно 380 МБ, и если я сделаю это:
readelf -W -s бинарный | awk ‘NR> 3 {sum + = $ 3} END {print sum}’
Я получаю 236221726 байт. Кажется низким, но, возможно, мне не хватает статических символов или что нет. Но если я сделаю:
readelf -W -s бинарный | сортировка -n -r -k 3 | Меньше
Я вижу это:
172766: 000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 symbolA
147338: 000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 символ B
132791: 000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 symbolA
107363: 000000000cf8d960 99993 FUNC GLOBAL DEFAULT 10 symbolB
Где symbolA и symbolB различаются только на 1 символ и разделяются на одно и то же.
Итак, мои вопросы:
1) Если эти вещи имеют один и тот же адрес, есть ли на самом деле четыре копии в моем двоичном файле?
2) Если не существует четырех копий, и это псевдонимы, не следует ли повторно сообщить об этом?
3) Если четыре копии, как и почему? Я предполагаю, что делаю что-то плохое в отношении связей.
4) Если не существует четырех копий, то суммарный размер из readelf будет меньше, чем фактический размер двоичного файла — почему?
Изменить: Добавление дополнительной информации … Приведенный выше вывод readelf был из полностью связанного двоичного файла. Рассматривая только .o, который содержит символ A / symbolB, readelf по-прежнему сообщает 1 копию каждого символа A и symbolB по одному и тому же адресу.
но если я objdump -d файл .o, я вижу только сборку для символа A.
Итак, является ли objdump или readelf «неправильным»?
Если вы разместите функцию определение в заголовке, а затем включите этот заголовок в разные исходные файлы, для каждого включения будет сгенерирована отдельная функция (ну, если она не указана повсюду в определенном исходном файле). Трудно сказать, не глядя на ваши источники, но это может быть так.
Рассмотрите возможность перемещения больших не встроенных функций в отдельные исходные файлы, оставляя только декларация в соответствующих заголовках. Это может помочь.
Других решений пока нет …