Fix overflow detection in ARM relocation
authorThomas Preud'homme <robotux@celest.fr>
Mon, 28 Jan 2013 18:13:25 +0000 (28 19:13 +0100)
committerThomas Preud'homme <robotux@celest.fr>
Mon, 28 Jan 2013 18:13:25 +0000 (28 19:13 +0100)
Fix overflow detection for R_ARM_CALL, R_ARM_PC24, R_ARM_JUMP24 and
R_ARM_PLT32 relocations on ARM. 26 bits means 25 bits for positive and
negative offsets !

tccelf.c

index b5eea07..a4dee19 100644 (file)
--- a/tccelf.c
+++ b/tccelf.c
@@ -613,14 +613,14 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s)
                 x += val - addr;
                 h = x & 2;
 #ifndef TCC_TARGET_PE
-                if ((x & 3) || x >= 0x4000000 || x < -0x4000000)
+                if ((x & 3) || x >= 0x2000000 || x < -0x2000000)
                     if (!(x & 3) || !blx_avail || !is_call)
                         if (s1->output_type == TCC_OUTPUT_MEMORY) {
                             x += add_jmp_table(s1, val) - val; /* add veneer */
                             is_thumb = 0; /* Veneer uses ARM instructions */
                         }
 #endif
-                if ((x & 3) || x >= 0x4000000 || x < -0x4000000)
+                if ((x & 3) || x >= 0x2000000 || x < -0x2000000)
                     if (!(x & 3) || !blx_avail || !is_call)
                         tcc_error("can't relocate value at %x",addr);
                 x >>= 2;