Почти одинаковые символы из readelf по тому же адресу

Я использую 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 «неправильным»?

0

Решение

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

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

0

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

Других решений пока нет …

По вопросам рекламы [email protected]