浏览代码

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

git-svn-id: trunk@30405 -
Jeppe Johansen 10 年之前
父节点
当前提交
7f34ab27d2
共有 1 个文件被更改,包括 2 次插入2 次删除
  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;