Один из вариантов может позволить компоновщику создать файл карты (/ MAP в Visual Studio).
Вы получите файл .map для каждого двоичного файла с двумя разделами:
Таблица сегментов
Start Length Name Class
0001:00000000 00010000H .textbss DATA
0002:00000000 000034b4H .text CODE
0003:00000000 00000104H .CRT$XCA DATA
0003:00000104 00000104H .CRT$XCAA DATA
0003:00000208 00000104H .CRT$XCZ DATA
0003:0000030c 00000104H .CRT$XIA DATA
...
Список символов (функций и данных)
Address Publics by Value Rva+Base Lib:Object
0000:00000000 ___safe_se_handler_count 00000000 <absolute>
0000:00000000 ___safe_se_handler_table 00000000 <absolute>
0000:00000000 ___ImageBase 00400000 <linker-defined>
0001:00000000 __enc$textbss$begin 00401000 <linker-defined>
0001:00010000 __enc$textbss$end 00411000 <linker-defined>
0002:000003a0 _wmain 004113a0 f console4.obj
...
Вы можете отличить функции от переменных с помощью обозначения "CODE" / "DATA" в списке сегментов.
Преимущество: вы получите все символы, даже те, что в библиотеках, которые не были удалены компоновщиком.
Недостаток: вы получите все символы, даже те, что в библиотеках, которые не были удалены компоновщиком. Я не знаю ни одного инструмента, который бы делал разделение кода / данных автоматически.