diff --git a/compiler/ogbase.pas b/compiler/ogbase.pas index 5954b2b469..2c4417b059 100644 --- a/compiler/ogbase.pas +++ b/compiler/ogbase.pas @@ -926,7 +926,7 @@ implementation ,oso_keep {$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], {data_nonlazy} [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 an entry is always (also in win64) 20 bytes and aligning 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; else result:=sizeof(pint); diff --git a/compiler/ogcoff.pas b/compiler/ogcoff.pas index 90fbaed156..ad82dc3f31 100644 --- a/compiler/ogcoff.pas +++ b/compiler/ogcoff.pas @@ -1315,6 +1315,8 @@ const pemagic : array[0..3] of byte = ( rel.reloctype:=IMAGE_REL_I386_SECREL32; {$endif i386} {$ifdef x86_64} + RELOC_NONE : + rel.reloctype:=IMAGE_REL_AMD64_ABSOLUTE; RELOC_RELATIVE : rel.reloctype:=IMAGE_REL_AMD64_REL32; RELOC_ABSOLUTE32 : @@ -1639,6 +1641,8 @@ const pemagic : array[0..3] of byte = ( rel_type:=RELOC_SECREL32; {$endif i386} {$ifdef x86_64} + IMAGE_REL_AMD64_ABSOLUTE: + rel_type:=RELOC_NONE; IMAGE_REL_AMD64_REL32: rel_type:=RELOC_RELATIVE; IMAGE_REL_AMD64_ADDR32, @@ -1933,7 +1937,9 @@ const pemagic : array[0..3] of byte = ( begin if (Copy(secname,1,6)='.edata') or (Copy(secname,1,5)='.rsrc') or +{$ifndef x86_64} (Copy(secname,1,6)='.pdata') or +{$endif} (Copy(secname,1,4)='.fpc') then include(secoptions,oso_keep); if (Copy(secname,1,6)='.idata') then diff --git a/compiler/systems/t_win.pas b/compiler/systems/t_win.pas index fd8288bc47..0bf3d501bd 100644 --- a/compiler/systems/t_win.pas +++ b/compiler/systems/t_win.pas @@ -1024,9 +1024,10 @@ implementation Concat(' SYMBOL __RUNTIME_PSEUDO_RELOC_LIST_END__'); Concat(' OBJSECTION .rdata*'); Concat(' OBJSECTION .rodata*'); + Concat(' OBJSECTION .xdata*'); Concat('ENDEXESECTION'); Concat('EXESECTION .pdata'); - Concat(' OBJSECTION .pdata'); + Concat(' OBJSECTION .pdata*'); Concat('ENDEXESECTION'); Concat('EXESECTION .bss'); Concat(' SYMBOL __bss_start__'); @@ -1066,7 +1067,9 @@ implementation Concat(' OBJSECTION .idata$3*'); Concat(' ZEROS 20'); Concat(' OBJSECTION .idata$4*'); + Concat(' SYMBOL __IAT_start__'); Concat(' OBJSECTION .idata$5*'); + Concat(' SYMBOL __IAT_end__'); Concat(' OBJSECTION .idata$6*'); Concat(' OBJSECTION .idata$7*'); Concat('ENDEXESECTION');