]> git.alrj.org Git - bold.git/blobdiff - Bold/elf.py
First support for .gnu.hash/DT_GNU_HASH.
[bold.git] / Bold / elf.py
index 3cf831959370fd36ae1765bb7d174e091b67dc80..0ff4602bab1cd736cbb71dd1d51410e8f77b2e9d 100644 (file)
@@ -40,6 +40,7 @@ class Elf64(object):
     self.local_symbols = {}
     self.global_symbols = {}
     self.undefined_symbols = []
+    self.common_symbols = []
 
     if path:
       self.filename = path
@@ -106,6 +107,11 @@ class Elf64(object):
             continue
           if symbol.st_shndx == SHN_ABS:
             continue
+          if symbol.st_shndx == SHN_COMMON:
+            if symbol.name:
+              sym = (symbol.name, symbol.st_size, symbol.st_value)
+              self.common_symbols.append(sym)
+              continue
           if symbol.st_shndx == SHN_UNDEF:
             if symbol.name:
               self.undefined_symbols.append(symbol.name)
@@ -132,8 +138,8 @@ class Elf64(object):
       target = sh.target.content
 
       for reloc in sh.content.relatab:
-        if reloc.symbol.st_shndx == SHN_UNDEF:
-          # This is an extern symbol, find it in all_global_symbols
+        if reloc.symbol.st_shndx in [SHN_UNDEF, SHN_COMMON]:
+          # This is an extern or common symbol, find it in all_global_symbols
           sym_address = all_global_symbols[reloc.symbol.name]
         else:
           # source == in which section it is defined
@@ -152,6 +158,9 @@ class Elf64(object):
         elif reloc.r_type == R_X86_64_32:
           format = "<I" # Direct 32 bit zero extended
           target_value = sym_address + reloc.r_addend
+        elif reloc.r_type == R_X86_64_32S:
+          format = "<i" # Direct 32 bit sign extended
+          target_value = sym_address + reloc.r_addend
         elif reloc.r_type == R_X86_64_PC16:
           format = "<h" # 16 bit sign extended pc relative
           target_value = sym_address + reloc.r_addend - pc_address