goodwatch/bin/printsizes.py

58 lines
1.6 KiB
Python
Raw Permalink Normal View History

2019-11-01 23:30:31 +00:00
#!/usr/bin/python3
## Quick little pyelftools script to test the size of a CC430F6137
## firmware image, warning the user if it looks too big.
from __future__ import print_function
import sys
from elftools.elf.elffile import ELFFile
from elftools.elf.sections import SymbolTableSection
def process_file(filename):
print("%s:" % filename);
with open(filename, 'rb') as f:
printsizes(f)
def printsizes(stream):
elffile = ELFFile(stream);
text=elffile.get_section_by_name('.text');
textlen=len(text.data());
rodata=elffile.get_section_by_name('.rodata');
2019-11-01 23:30:31 +00:00
rodatalen=0;
try: rodatalen=len(rodata.data());
except: pass;
codeperc=(textlen+rodatalen)*100.0/32768;
print("\t%d bytes of .text, %d bytes of .rodata (%d%% Flash)" % (textlen,rodatalen,codeperc));
if codeperc>90:
print("WARNING: %d percent of Flash is used!"%codeperc);
datalen=0;
bsslen=0;
noinitlen=0;
data=elffile.get_section_by_name('.data');
datalen=len(data.data());
bss=elffile.get_section_by_name('.bss');
bsslen=len(bss.data());
2017-11-18 18:04:02 +00:00
noinit=elffile.get_section_by_name('.noinit');
if noinit!=None:
noinitlen=len(noinit.data());
2017-11-18 18:04:02 +00:00
dataperc=(datalen+bsslen+noinitlen)*100.0/4096;
if datalen+bsslen+noinitlen>0:
print("\t%d bytes of .data, %d bytes of .bss, %d bytes of .noinit (%d%% RAM)"
%(datalen,bsslen,noinitlen,dataperc));
if dataperc>80:
print("WARNING: %d percent of data is used!"%dataperc);
if __name__ == '__main__':
for filename in sys.argv[1:]:
process_file(filename)