diff --git a/compare_sizes.py b/compare_sizes.py index eb62ecc..1072ac4 100755 --- a/compare_sizes.py +++ b/compare_sizes.py @@ -9,7 +9,7 @@ import os import subprocess from collections import namedtuple -from shared_python import elf_so_deps +from shared_python import elf_so_deps, readlink_rec ''' An ELF object, including the path to the ELF itself, and the path to its @@ -92,6 +92,8 @@ def objects_list(args): else: objects = args.object + objects = list(map(readlink_rec, objects)) + for obj in objects: out.append(ElfObject(obj, matching_eh_elf(args.eh_elfs, obj))) @@ -118,6 +120,15 @@ def process_args(): return parser.parse_args() +def get_or_default(obj, field, default=None): + ''' Access a field of a subscriptable, returning a default if there is no + such field ''' + + if field not in obj: + return default + return obj[field] + + def main(): args = process_args() objs = objects_list(args) @@ -165,9 +176,13 @@ def main(): elf_sections = get_elf_sections(obj.elf) eh_elf_sections = get_elf_sections(obj.eh_elf) - eh_frame_size = elf_sections['.eh_frame']['size'] - eh_elf_text_size = eh_elf_sections['.text']['size'] - eh_elf_size = eh_elf_text_size + eh_elf_sections['.rodata']['size'] + eh_frame_size = get_or_default( + elf_sections, '.eh_frame', {'size': 0})['size'] + eh_elf_text_size = get_or_default( + eh_elf_sections, '.text', {'size': 0})['size'] + eh_elf_size = eh_elf_text_size + \ + get_or_default( + eh_elf_sections, '.rodata', {'size': 0})['size'] total_eh_frame_size += eh_frame_size total_eh_elf_text_size += eh_elf_text_size diff --git a/shared_python.py b/shared_python.py index 8f39296..f3d29c4 100644 --- a/shared_python.py +++ b/shared_python.py @@ -6,6 +6,16 @@ import os from collections import namedtuple +def readlink_rec(path): + ''' Returns the canonical path of `path`, resolving multiple layers of + symlinks ''' + while os.path.islink(path): + path = os.path.join( + os.path.dirname(path), + os.readlink(path)) + return path + + def is_newer(file1, file2): ''' Returns True iff file1 is newer than file2 ''' try: