Как отладить процесс компоновки GCC/LD для STL/C++

Я работаю над голым -железным кортексом -M3 на C++ для удовольствия и прибыли. Я использую библиотеку STL, так как мне нужны контейнеры. Я думал, что простое предоставление моего распределителя не добавит много кода в окончательный двоичный файл, поскольку вы получаете только то, что используете.

На самом деле я даже не ожидал никакого процесса связывания с STL. (отдал свой аллокатор ), так как я думал, что это все шаблонный код.

Кстати, я компилирую с -fno-exception.

К сожалению, к моему двоичному файлу добавляется около 600 КБ или более. Я посмотрел, какие символы включены в окончательный двоичный файл с помощью nm, и мне это показалось шуткой. Список такой длинный, что я не буду пытаться пройти мимо него.Хотя есть и слабые символы.

Я также посмотрел файл.map, сгенерированный компоновщиком, и даже нашел символы scanf

.text
0x000158bc       0x30   /CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/lib/libc.a(sscanf.o)
0x000158bc                __sscanf
0x000158bc                sscanf
0x000158bc                _IO_sscanf

И:

$ arm-none-linux-gnueabi-nm binary | grep scanf
000158bc T _IO_sscanf
0003e5f4 T _IO_vfscanf
0003e5f4 T _IO_vfscanf_internal
000164a8 T _IO_vsscanf
00046814 T ___vfscanf
000158bc T __sscanf
00046814 T __vfscanf
000164a8 W __vsscanf
000158bc T sscanf
00046814 W vfscanf
000164a8 W vsscanf

Как я могу отладить это? Для начала я хотел понять, что именно GCC использует для линковки (Я линкую через GCC ). Я знаю, что если символ находится в текстовом сегменте, то весь сегмент используется, но все же это слишком много.

Любое предложение о том, как решить эту проблему, будет действительно оценено.

Спасибо

10
задан jww 2 February 2019 в 15:25
поделиться