Browse Source

Handle cross-endian case inside TCoffObjData.writereloc method

Pierre Muller 10 months ago
parent
commit
400094921c
1 changed files with 36 additions and 1 deletions
  1. 36 1
      compiler/ogcoff.pas

+ 36 - 1
compiler/ogcoff.pas

@@ -1639,7 +1639,18 @@ const pemagic : array[0..3] of byte = (
 
 
 
 
     procedure TCoffObjData.writereloc(data:aint;len:aword;p:TObjSymbol;reloctype:TObjRelocationType);
     procedure TCoffObjData.writereloc(data:aint;len:aword;p:TObjSymbol;reloctype:TObjRelocationType);
+      type
+        multi = record
+          case integer of
+          0 : (ba : array[0..sizeof(aint)-1] of byte);
+          1 : (b : byte);
+          2 : (w : word);
+          4 : (d : dword);
+          8 : (q : qword);
+        end;
+
       var
       var
+        ba : multi;
         curraddr,
         curraddr,
         symaddr : aword;
         symaddr : aword;
       begin
       begin
@@ -1723,7 +1734,31 @@ const pemagic : array[0..3] of byte = (
             if reloctype=RELOC_RVA then
             if reloctype=RELOC_RVA then
               internalerror(200603033);
               internalerror(200603033);
           end;
           end;
-        CurrObjSec.write(data,len);
+        if target_info.endian<>source_info.endian then
+          begin
+            ba.q:=0;
+            if (len<=sizeof(data)) then
+              case len of
+                1 : ba.b:=byte(data);
+                2 : begin
+                      ba.w:=word(data);
+                      ba.w:=swapendian(ba.w);
+                    end;
+                4 : begin
+                      ba.d:=dword(data);
+                      ba.d:=swapendian(ba.d);
+                    end;
+                8 : begin
+                      ba.q:=qword(data);
+                      ba.q:=swapendian(ba.q);
+                    end;
+              else
+                internalerror(2024012501);
+              end;
+            CurrObjSec.write(ba,len);
+          end
+        else
+          CurrObjSec.write(data,len);
       end;
       end;