Explorar o código

* Changed attributes of .pdata section so it is smart-linkable on x86_64.
* Changed alignment of .pdata section to 4.
+ Support saving RELOC_NONE relocations to .o files and reading them back on x86_64.

git-svn-id: trunk@19070 -

sergei %!s(int64=14) %!d(string=hai) anos
pai
achega
6280ee2eed
Modificáronse 3 ficheiros con 15 adicións e 4 borrados
  1. 5 3
      compiler/ogbase.pas
  2. 6 0
      compiler/ogcoff.pas
  3. 4 1
      compiler/systems/t_win.pas

+ 5 - 3
compiler/ogbase.pas

@@ -926,7 +926,7 @@ implementation
                        ,oso_keep
                        ,oso_keep
 {$endif FPC_USE_TLS_DIRECTORY}
 {$endif FPC_USE_TLS_DIRECTORY}
           ],
           ],
-          {pdata} [oso_load,oso_readonly,oso_keep],
+          {pdata} [oso_data,oso_load,oso_readonly {$ifndef x86_64},oso_keep{$endif}],
           {stub} [oso_Data,oso_load,oso_readonly,oso_executable],
           {stub} [oso_Data,oso_load,oso_readonly,oso_executable],
           {data_nonlazy}  [oso_Data,oso_load,oso_write],
           {data_nonlazy}  [oso_Data,oso_load,oso_write],
           {data_lazy} [oso_Data,oso_load,oso_write],
           {data_lazy} [oso_Data,oso_load,oso_write],
@@ -1001,8 +1001,10 @@ implementation
           { For idata (at least idata2) it must be 4 bytes, because
           { For idata (at least idata2) it must be 4 bytes, because
             an entry is always (also in win64) 20 bytes and aligning
             an entry is always (also in win64) 20 bytes and aligning
             on 8 bytes will insert 4 bytes between the entries resulting
             on 8 bytes will insert 4 bytes between the entries resulting
-            in a corrupt idata section }
-          sec_idata2,sec_idata4,sec_idata5,sec_idata6,sec_idata7:
+            in a corrupt idata section.
+            Same story with .pdata, it has 4-byte elements which should
+            be packed without gaps. }
+          sec_idata2,sec_idata4,sec_idata5,sec_idata6,sec_idata7,sec_pdata:
             result:=4;
             result:=4;
           else
           else
             result:=sizeof(pint);
             result:=sizeof(pint);

+ 6 - 0
compiler/ogcoff.pas

@@ -1315,6 +1315,8 @@ const pemagic : array[0..3] of byte = (
                 rel.reloctype:=IMAGE_REL_I386_SECREL32;
                 rel.reloctype:=IMAGE_REL_I386_SECREL32;
 {$endif i386}
 {$endif i386}
 {$ifdef x86_64}
 {$ifdef x86_64}
+              RELOC_NONE :
+                rel.reloctype:=IMAGE_REL_AMD64_ABSOLUTE;
               RELOC_RELATIVE :
               RELOC_RELATIVE :
                 rel.reloctype:=IMAGE_REL_AMD64_REL32;
                 rel.reloctype:=IMAGE_REL_AMD64_REL32;
               RELOC_ABSOLUTE32 :
               RELOC_ABSOLUTE32 :
@@ -1639,6 +1641,8 @@ const pemagic : array[0..3] of byte = (
                rel_type:=RELOC_SECREL32;
                rel_type:=RELOC_SECREL32;
 {$endif i386}
 {$endif i386}
 {$ifdef x86_64}
 {$ifdef x86_64}
+             IMAGE_REL_AMD64_ABSOLUTE:
+               rel_type:=RELOC_NONE;
              IMAGE_REL_AMD64_REL32:
              IMAGE_REL_AMD64_REL32:
                rel_type:=RELOC_RELATIVE;
                rel_type:=RELOC_RELATIVE;
              IMAGE_REL_AMD64_ADDR32,
              IMAGE_REL_AMD64_ADDR32,
@@ -1933,7 +1937,9 @@ const pemagic : array[0..3] of byte = (
                  begin
                  begin
                    if (Copy(secname,1,6)='.edata') or
                    if (Copy(secname,1,6)='.edata') or
                       (Copy(secname,1,5)='.rsrc') or
                       (Copy(secname,1,5)='.rsrc') or
+{$ifndef x86_64}
                       (Copy(secname,1,6)='.pdata') or
                       (Copy(secname,1,6)='.pdata') or
+{$endif}
                       (Copy(secname,1,4)='.fpc') then
                       (Copy(secname,1,4)='.fpc') then
                      include(secoptions,oso_keep);
                      include(secoptions,oso_keep);
                    if (Copy(secname,1,6)='.idata') then
                    if (Copy(secname,1,6)='.idata') then

+ 4 - 1
compiler/systems/t_win.pas

@@ -1024,9 +1024,10 @@ implementation
             Concat('  SYMBOL __RUNTIME_PSEUDO_RELOC_LIST_END__');
             Concat('  SYMBOL __RUNTIME_PSEUDO_RELOC_LIST_END__');
             Concat('  OBJSECTION .rdata*');
             Concat('  OBJSECTION .rdata*');
             Concat('  OBJSECTION .rodata*');
             Concat('  OBJSECTION .rodata*');
+            Concat('  OBJSECTION .xdata*');
             Concat('ENDEXESECTION');
             Concat('ENDEXESECTION');
             Concat('EXESECTION .pdata');
             Concat('EXESECTION .pdata');
-            Concat('  OBJSECTION .pdata');
+            Concat('  OBJSECTION .pdata*');
             Concat('ENDEXESECTION');
             Concat('ENDEXESECTION');
             Concat('EXESECTION .bss');
             Concat('EXESECTION .bss');
             Concat('  SYMBOL __bss_start__');
             Concat('  SYMBOL __bss_start__');
@@ -1066,7 +1067,9 @@ implementation
             Concat('  OBJSECTION .idata$3*');
             Concat('  OBJSECTION .idata$3*');
             Concat('  ZEROS 20');
             Concat('  ZEROS 20');
             Concat('  OBJSECTION .idata$4*');
             Concat('  OBJSECTION .idata$4*');
+            Concat('  SYMBOL __IAT_start__');
             Concat('  OBJSECTION .idata$5*');
             Concat('  OBJSECTION .idata$5*');
+            Concat('  SYMBOL __IAT_end__');
             Concat('  OBJSECTION .idata$6*');
             Concat('  OBJSECTION .idata$6*');
             Concat('  OBJSECTION .idata$7*');
             Concat('  OBJSECTION .idata$7*');
             Concat('ENDEXESECTION');
             Concat('ENDEXESECTION');