Issue #20: don't fail on relocations creating out-of-bounds values.
authorEli Bendersky <eliben@gmail.com>
Sun, 5 Jan 2014 23:53:46 +0000 (15:53 -0800)
committerEli Bendersky <eliben@gmail.com>
Sun, 5 Jan 2014 23:53:46 +0000 (15:53 -0800)
This came up with some very large object files. The solution (wrap around at
value size) doesn't feel good, but it appears to be the way binutils does it
too. Are there legitimate cases for this?

elftools/elf/relocation.py

index 4ae73d72ff6045d1ea3f5e044e1024e52509fe46..176f7c5404abf421fd0016ec4e5d96bfaaca4048 100644 (file)
@@ -178,6 +178,11 @@ class RelocationHandler(object):
             addend=reloc['r_addend'] if recipe.has_addend else 0)
         # 3. Write the relocated value back into the stream
         stream.seek(reloc['r_offset'])
+
+        # Make sure the relocated value fits back by wrapping it around. This
+        # looks like a problem, but it seems to be the way this is done in
+        # binutils too.
+        relocated_value = relocated_value % (2 ** (recipe.bytesize * 8))
         value_struct.build_stream(relocated_value, stream)
 
     # Relocations are represented by "recipes". Each recipe specifies: