diff -r 71343ce52545 platform/s3c2410/tools/machines.py --- a/platform/s3c2410/tools/machines.py Tue Aug 03 13:04:38 2010 +0200 +++ b/platform/s3c2410/tools/machines.py Tue Aug 03 13:09:16 2010 +0200 @@ -92,7 +92,7 @@ skyeye = "gta01.skyeye" device_core = "gta01" memory = s3c2410.memory.copy() - memory['physical'] = [Region(0x30000000L, 0x38000000L)] + memory['physical'] = [Region(0x33000000L, 0x38000000L)] # memory['reserved'] = [Region(0x60000000L, 0xffffffffL, "reserved")] # memory['sfr'] = [Region(0x48000000L, 0x60000000L, "dedicated")] memory['rom1'] = [Region(0x08000000L, 0x30000000L, "dedicated")] diff -r 71343ce52545 tools/pyelf/elf/constants.py --- a/tools/pyelf/elf/constants.py Tue Aug 03 13:04:38 2010 +0200 +++ b/tools/pyelf/elf/constants.py Tue Aug 03 13:09:16 2010 +0200 @@ -237,9 +237,11 @@ _show = {} class ArmFlags(IntString): + """IntString for Arm Flags field""" _show = {} class MipsFlags(IntString): + """IntString for Mips Flags field""" _show = {} EF_MIPS_NOREORDER = MipsFlags(1, "noreorder") @@ -315,6 +317,7 @@ PT_MIPS_REGINFO = ElfPhType(PT_LOPROC + 0, "MIPS_REGINFO") +PT_ARM_EXIDX = ElfPhType(PT_LOPROC + 1, "ARM_EXIDX") PT_PAX_FLAGS = ElfPhType(PT_LOOS + 0x5041580L, "PAX_FLAGS") PT_GNU_EH_FRAME = ElfPhType(PT_LOOS + 0x474e550L, "GNU_EH_FRAME") PT_GNU_STACK = ElfPhType(PT_LOOS + 0x474e551L, "GNU_STACK") @@ -329,13 +332,18 @@ PF_MASKOS = 0x0FF00000L PF_MASKPROC = 0xF0000000L -SHN_UNDEF = 0 -SHN_LORESERVE = 0xff00 -SHN_LOPROC = 0xff00 -SHN_HIPROC = 0xff1f -SHN_ABS = 0xfff1 -SHN_COMMON = 0xfff2 -SHN_HIRESERVE = 0xffff +class ElfShIndex(IntString): + """IntString for ELF section indexes""" + _show = {} + _default_string = "%3d" + +SHN_UNDEF = ElfShIndex(0, "UND") +SHN_LORESERVE = ElfShIndex(0xff00, "RSV") +SHN_LOPROC = ElfShIndex(0xff00, "PRC") +SHN_HIPROC = ElfShIndex(0xff1f, "PRC") +SHN_ABS = ElfShIndex(0xfff1, "ABS") +SHN_COMMON = ElfShIndex(0xfff2, "COM") +SHN_HIRESERVE = ElfShIndex(0xffff, "RCV") class ElfShType(IntString): """IntString for ELF section header types""" @@ -356,8 +364,7 @@ SHT_INIT_ARRAY = ElfShType(14, "INIT_ARRAY") SHT_FINI_ARRAY = ElfShType(15, "FINI_ARRAY") -SHT_MIPS_REGINFO = ElfShType(0x70000006, "MIPS_REGINFO") - +SHT_GROUP = ElfShType(17, "GROUP") SHT_LOPROC = 0x70000000L SHT_HIPROC = 0x7fffffffL @@ -365,7 +372,11 @@ SHT_HIUSER = 0xffffffffL +SHT_ARM_EXIDX = ElfShType(SHT_LOPROC + 1, "ARM_EXIDX") + +SHT_ARM_EXIDX = ElfShType(SHT_LOPROC + 1, 'ARM_EXIDX') SHT_IA_64_UNWIND = ElfShType(SHT_LOPROC + 1, "IA_64_UNWIND") +SHT_MIPS_REGINFO = ElfShType(SHT_LOPROC + 6, "MIPS_REGINFO") SHT_VERNEED = ElfShType(0x6ffffffe, "VERNEED") SHT_VERSYM = ElfShType(0x6fffffff, "VERSYM") @@ -380,22 +391,43 @@ SHF_LINK_ORDER = (1 << 7) +SHF_GROUP = (1 << 9) + SHF_MASKOS = 0x0f000000L SHF_MASKPROC = 0xf0000000L STN_UNDEF = 0 -STB_LOCAL = 0 -STB_GLOBAL = 1 -STB_WEAK = 2 -STB_LOPROC = 13 -STB_HIPROC = 15 +class ElfSymbolBinding(IntString): + """IntString for the ELF Symbol Table Binding.""" + _show = {} + _default_string = ": %d" -STT_NOTYPE = 0 -STT_OBJECT = 1 -STT_FUNC = 2 -STT_SECTION = 3 -STT_FILE = 4 -STT_LOPROC = 13 -STT_HIPROC = 15 +STB_LOCAL = ElfSymbolBinding(0, "LOCAL") +STB_GLOBAL = ElfSymbolBinding(1, "GLOBAL") +STB_WEAK = ElfSymbolBinding(2, "WEAK") +STB_LOPROC = ElfSymbolBinding(13, "processor specific") +STB_HIPROC = ElfSymbolBinding(15, "processor specific") +class ElfSymbolType(IntString): + """IntString for the ELF Symbol Table Type.""" + _show = {} + _default_string = ": %d" + +STT_NOTYPE = ElfSymbolType(0, "NOTYPE") +STT_OBJECT = ElfSymbolType(1, "OBJECT") +STT_FUNC = ElfSymbolType(2, "FUNC") +STT_SECTION = ElfSymbolType(3, "SECTION") +STT_FILE = ElfSymbolType(4, "FILE") +STT_LOPROC = ElfSymbolType(13, "processor specific") +STT_HIPROC = ElfSymbolType(15, "processor specific") + +class ElfSymbolVisibility(IntString): + """IntString for the Elf Symbol Table Visibility.""" + _show = {} + _default_string = ": %" + +STV_DEFAULT = ElfSymbolVisibility(0, "DEFAULT") +STV_INTERNAL = ElfSymbolVisibility(1, "INTERNAL") +STV_HIDDEN = ElfSymbolVisibility(2, "HIDDEN") +STV_PROTECTED = ElfSymbolVisibility(3, "PROTECTED") diff -r 71343ce52545 tools/pyelf/elf/segment.py --- a/tools/pyelf/elf/segment.py Tue Aug 03 13:04:38 2010 +0200 +++ b/tools/pyelf/elf/segment.py Tue Aug 03 13:09:16 2010 +0200 @@ -67,7 +67,7 @@ __revision__ = 1.0 from elf.ByteArray import ByteArray -from elf.constants import PT_NULL, PT_PHDR, SHT_NOBITS +from elf.constants import PT_NULL, PT_PHDR, SHT_NOBITS, SHT_ARM_EXIDX from elf.structures import InvalidArgument, ELF_PH_CLASSES from elf.util import Span, Unprepared @@ -246,6 +246,9 @@ """Return a copy of the Elf segment.""" for sect in self.sections: + # special handling for ARM EABI exception tables + if sect.type == SHT_ARM_EXIDX: + sect.link = None assert sect.link is None sections = [sect.copy() for sect in self.sections] diff -r 71343ce52545 tools/pyelf/weaver/image.py --- a/tools/pyelf/weaver/image.py Tue Aug 03 13:04:38 2010 +0200 +++ b/tools/pyelf/weaver/image.py Tue Aug 03 13:09:16 2010 +0200 @@ -60,8 +60,8 @@ import os.path from elf.core import UnpreparedElfFile, SectionedElfSegment from elf.section import UnpreparedElfSection -from elf.constants import PT_PAX_FLAGS, PT_GNU_STACK, PT_PHDR, \ - PT_LOAD, PT_MIPS_REGINFO, ET_EXEC, \ +from elf.constants import PT_PAX_FLAGS, PT_GNU_STACK, PT_PHDR, SHT_ARM_EXIDX, \ + PT_LOAD, PT_MIPS_REGINFO, PT_ARM_EXIDX, ET_EXEC, \ SHT_PROGBITS, SHF_WRITE, SHF_ALLOC, \ PF_R, PF_W, EF_MIPS_ABI_O64, ElfMachine from elf.ByteArray import ByteArray @@ -79,8 +79,26 @@ PT_GNU_STACK, # PT_GNU_STACK. Indicates stack executability. PT_MIPS_REGINFO, # PT_PHDR, # PT_PHDR. Entry for header table itself + SHT_ARM_EXIDX, ] +# List of symbols that should be changed when they're added to the +# image symbol table. +# Probably should be list of regexs, but that's not needed yet. +NO_PREFIX_SYMBOLS = ( + # ARM mapping symbols. + "$a", # ARM code + "$t", # THUMB code. + "$d", # Data items + ) + +def can_prefix_symbol(symbol): + """ + Return whether or not a symbol should have a prefix added to it in + the final image. + """ + return symbol.name not in NO_PREFIX_SYMBOLS + def valid_segment(segment): if segment.type in skipped_types: return False @@ -88,7 +106,7 @@ if segment.get_memsz() == 0: return False - if segment.type != PT_LOAD: + if segment.type != PT_LOAD and segment.type != PT_ARM_EXIDX: raise MergeError, "Unable to handle segments that aren't " \ "of type LOAD (found type 0x%x)." % (segment.type) @@ -1109,13 +1127,17 @@ if obj.attrs.phys_addr is not None: pbase = obj.attrs.phys_addr pend = pbase + obj.attrs.size - 1 - physical_objects[pbase, pend] = obj.attrs.abs_name() + if (pbase, pend) in physical_objects: + physical_objects[pbase, pend].append(obj.attrs.abs_name()) + else: + physical_objects[pbase, pend] = [obj.attrs.abs_name()] print "VIRTUAL:" for (base, end), name in sorted(virtual_objects.items()): print " <%08x:%08x> %s" % (base, end, name) print "PHYSICAL:" - for (base, end), name in sorted(physical_objects.items()): - print " <%08x:%08x> %s" % (base, end, name) + for (base, end), names in sorted(physical_objects.items()): + for name in names: + print " <%08x:%08x> %s" % (base, end, name)