Do you know about the "nm" tool ... ?
Since I have no idea what you are talking about, I guess the answer is no.
"nm" is one of a set of utilities that comes as part of gcc compilers (and many others too, i believe. It essentially operates on .elf format files, so it will probably work on any tool set that produces .elf files.) It analyzes the symbol information that is present in such files (so it will NOT work on .bin or .hex files.)
It will have a prefix, like "avr-nm" or "arm-none-eabi-nm"
The most useful form for program size analysis is "nm -C -S --size-sort myfile.elf", which will list each symbol (possibly de-mangled from C++ names ("-C") and their size ("-S"), and sort the output so that the biggest things are at the end.
Here's some output from a recent AVR/Arduino program:
0000249c 00000046 T sprintf_P
00001026 00000048 t refreshCache(unsigned long)
000002d4 0000004a t micros
00002424 0000004e T atol
00000382 0000004e t twi_transmit
00001222 00000050 t refreshInProgress()
000014e2 00000050 t String::reserve(unsigned int)
00001556 00000056 t String::String(char const*) [clone .part.2]
000015ac 00000056 t String::operator=(char const*)
00000180 0000005a t Print::write(unsigned char const*, unsigned int)
00000820 0000005a t TwoWire::write(unsigned char const*, unsigned int)
000008d8 0000005a t DS3232RTC::writeRTC(unsigned char, unsigned char*, unsigned char) [clone .constprop.19]
00000b84 0000005c t setTime(unsigned long)
0000087a 0000005e t TwoWire::write(unsigned char)
000028c2 00000060 T fputc
00000272 00000062 t pinMode
0000031e 00000064 t delay
00001612 00000070 t twi_stop
00001272 00000078 t setNextRefresh(unsigned long)
00001090 00000078 t DS3232RTC::readRTC(unsigned char, unsigned char*, unsigned char) [clone .constprop.28]
00000ae2 00000080 t Stream::timedRead() [clone .constprop.6]
00001790 00000094 T __vector_16
000001da 00000098 t digitalWrite
000013f6 000000b2 t setNextCheckTime()
00000982 000000b8 t SoftwareSerial::write(unsigned char)
00002922 000000bc T __ultoa_invert
00001152 000000d0 t DS3232RTC::get()
00001a62 000000f0 T __vector_3
00001a62 000000f0 T __vector_4
00001a62 000000f0 T __vector_5
000012ea 0000010c t setNextRefreshDate()
00000be0 0000010e t now()
00001682 0000010e t printTime(String, unsigned long)
00002c8e 00000112 T free
00002b56 00000138 T malloc
00001b52 0000013c t global constructors keyed to 65535_0_sketch_jun20a.ino.cpp.o.2463
00002da0 0000017a T realloc
00000cee 00000180 t makeTime(tmElements_t const&)
0000044e 0000019e t twi_readFrom.constprop.38
00000e6e 000001b8 t breakTime(unsigned long, tmElements_t&)
000005ec 000001e0 t TwoWire::endTransmission(unsigned char) [clone .constprop.35]
00001824 0000023e T __vector_24
000024e2 000003b4 T vfprintf
00001c8e 0000075e T main
The output format is "<value> <size> <type> <symbol>", where "<type>" is "t" or "T" for code ("text"), "b"/"B" for uninitialized data ("bss"), and "d"/"D" for initialized data. Uppercase means a global symbol, lowercase means local.
In the above sample output, one might wonder "why is free/malloc/realloc here; I didn't use them", or "gee, printf really is pretty big!", or "fputc? In Arduino code?" (None of the "big" symbols in my example are data, but in a display example you might notice "do I really need such large and multiple fonts?")