Browse Source

Fixed issue with COFF linker. The addend wasn't shifted up by four before being added.

git-svn-id: trunk@30405 -
Jeppe Johansen 10 năm trước cách đây
mục cha
commit
7f34ab27d2
1 tập tin đã thay đổi với 2 bổ sung2 xóa
  1. 2 2
      compiler/ogcoff.pas

+ 2 - 2
compiler/ogcoff.pas

@@ -915,7 +915,7 @@ const pemagic : array[0..3] of byte = (
 {$ifdef arm}
                 RELOC_RELATIVE_24:
                   begin
-                    addend:=sarlongint(((address and $ffffff) shl 8),8);
+                    addend:=sarlongint(((address and $ffffff) shl 8),6); // Sign-extend while shifting left twice
                     relocval:=longint(relocval - objsec.mempos - objreloc.dataoffset + addend) shr 2;
                     address:=(address and $ff000000) or (relocval and $ffffff);
                     relocval:=relocval shr 24;
@@ -924,7 +924,7 @@ const pemagic : array[0..3] of byte = (
                   end;
                 RELOC_RELATIVE_24_THUMB:
                   begin
-                    addend:=sarlongint(((address and $ffffff) shl 8),8);
+                    addend:=sarlongint(((address and $ffffff) shl 8),6); // Sign-extend while shifting left twice, the assembler never sets the H bit
                     relocval:=longint(relocval - objsec.mempos - objreloc.dataoffset + addend) shr 1;
                     address:=(address and $ff000000) or ((relocval shr 1) and $ffffff) or ((relocval and 1) shl 24);
                     relocval:=relocval shr 25;