mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-08 05:19:14 +02:00
* 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 -
This commit is contained in:
parent
782cdd8e9a
commit
6280ee2eed
@ -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 }
|
in a corrupt idata section.
|
||||||
sec_idata2,sec_idata4,sec_idata5,sec_idata6,sec_idata7:
|
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);
|
||||||
|
@ -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
|
||||||
|
@ -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');
|
||||||
|
Loading…
Reference in New Issue
Block a user