Ответ 1
Один из подходов заключался бы в создании файла карты компоновщика (например, опции передачи -Wl, -Map, program.map в gcc) и изучения .datastrong > и .bss для любых вкладов от объектных файлов, которые вы хотите запустить без глобальных привязок.
Например, если в моем исходном файле hello.c есть:
static int gTable[100];
файл компоновщика ссылок будет иметь в нем что-то вроде этого:
.bss 0x0000000000600940 0x1b0
*(.dynbss)
.dynbss 0x0000000000000000 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o
*(.bss .bss.* .gnu.linkonce.b.*)
.bss 0x0000000000600940 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o
.bss 0x0000000000600940 0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o
.bss 0x0000000000600940 0x1 /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o
*fill* 0x0000000000600941 0x1f 00
.bss 0x0000000000600960 0x190 hello.o
Вы можете видеть, что hello.o вносит 0x190 (400) байтов в раздел .bss. Я использовал подход для разбора файла карты ссылок с помощью Python script, чтобы генерировать размер кода и показатели использования ОЗУ для встроенного проекта с разумным успехом в прошлом; формат вывода текста из компоновщика довольно стабилен.