mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-01 22:30:30 +02:00
+ TlsDirectory handling code
git-svn-id: trunk@17903 -
This commit is contained in:
parent
bcb2bb9e5b
commit
30feeff3c2
@ -484,6 +484,14 @@ implementation
|
|||||||
aux : byte;
|
aux : byte;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ This is defined in rtl/win/sysos.inc source }
|
||||||
|
tlsdirectory=packed record
|
||||||
|
data_start, data_end : PUInt;
|
||||||
|
index_pointer, callbacks_pointer : PUInt;
|
||||||
|
zero_fill_size : dword;
|
||||||
|
flags : dword;
|
||||||
|
end;
|
||||||
|
|
||||||
const
|
const
|
||||||
SymbolMaxGrow = 200*sizeof(coffsymbol);
|
SymbolMaxGrow = 200*sizeof(coffsymbol);
|
||||||
StrsMaxGrow = 8192;
|
StrsMaxGrow = 8192;
|
||||||
@ -1017,6 +1025,8 @@ const pemagic : array[0..3] of byte = (
|
|||||||
createsection(sec_code);
|
createsection(sec_code);
|
||||||
createsection(sec_data);
|
createsection(sec_data);
|
||||||
createsection(sec_bss);
|
createsection(sec_bss);
|
||||||
|
if tf_section_threadvars in target_info.flags then
|
||||||
|
createsection(sec_threadvar);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -2222,7 +2232,9 @@ const pemagic : array[0..3] of byte = (
|
|||||||
textExeSec,
|
textExeSec,
|
||||||
dataExeSec,
|
dataExeSec,
|
||||||
bssExeSec,
|
bssExeSec,
|
||||||
idataExeSec : TExeSection;
|
idataExeSec,
|
||||||
|
tlsExeSec : TExeSection;
|
||||||
|
tlsdir : TlsDirectory;
|
||||||
hassymbols,
|
hassymbols,
|
||||||
writeDbgStrings : boolean;
|
writeDbgStrings : boolean;
|
||||||
|
|
||||||
@ -2238,6 +2250,31 @@ const pemagic : array[0..3] of byte = (
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure UpdateTlsDataDir;
|
||||||
|
var
|
||||||
|
{callbacksection : TExeSection;}
|
||||||
|
tlsexesymbol: TExeSymbol;
|
||||||
|
tlssymbol: TObjSymbol;
|
||||||
|
begin
|
||||||
|
{ according to GNU ld,
|
||||||
|
the callback routines should be placed into .CRT$XL*
|
||||||
|
sections, and the thread local variables in .tls
|
||||||
|
__tls_start__ and __tls_end__ symbols
|
||||||
|
should be used for the initialized part,
|
||||||
|
which we do not support yet. }
|
||||||
|
{ For now, we only pass the address of the __tls_used
|
||||||
|
asm symbol into PE_DATADIR_TLS with the correct
|
||||||
|
size of this table (different for win32/win64 }
|
||||||
|
tlsexesymbol:=texesymbol(ExeSymbolList.Find(
|
||||||
|
target_info.Cprefix+'_tls_used'));
|
||||||
|
if assigned(tlsexesymbol) then
|
||||||
|
begin
|
||||||
|
tlssymbol:=tlsexesymbol.ObjSymbol;
|
||||||
|
peoptheader.DataDirectory[PE_DATADIR_TLS].vaddr:=tlssymbol.address;
|
||||||
|
peoptheader.DataDirectory[PE_DATADIR_TLS].size:=Sizeof(tlsdirectory);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
result:=false;
|
result:=false;
|
||||||
FCoffSyms:=TDynamicArray.Create(SymbolMaxGrow);
|
FCoffSyms:=TDynamicArray.Create(SymbolMaxGrow);
|
||||||
@ -2245,6 +2282,7 @@ const pemagic : array[0..3] of byte = (
|
|||||||
textExeSec:=FindExeSection('.text');
|
textExeSec:=FindExeSection('.text');
|
||||||
dataExeSec:=FindExeSection('.data');
|
dataExeSec:=FindExeSection('.data');
|
||||||
bssExeSec:=FindExeSection('.bss');
|
bssExeSec:=FindExeSection('.bss');
|
||||||
|
tlsExeSec:=FindExeSection('.tls');
|
||||||
if not assigned(TextExeSec) or
|
if not assigned(TextExeSec) or
|
||||||
not assigned(DataExeSec) then
|
not assigned(DataExeSec) then
|
||||||
internalerror(200602231);
|
internalerror(200602231);
|
||||||
@ -2353,6 +2391,7 @@ const pemagic : array[0..3] of byte = (
|
|||||||
peoptheader.SizeOfHeapCommit:=$1000;
|
peoptheader.SizeOfHeapCommit:=$1000;
|
||||||
peoptheader.NumberOfRvaAndSizes:=PE_DATADIR_ENTRIES;
|
peoptheader.NumberOfRvaAndSizes:=PE_DATADIR_ENTRIES;
|
||||||
UpdateDataDir('.idata',PE_DATADIR_IDATA);
|
UpdateDataDir('.idata',PE_DATADIR_IDATA);
|
||||||
|
UpdateTlsDataDir;
|
||||||
UpdateDataDir('.edata',PE_DATADIR_EDATA);
|
UpdateDataDir('.edata',PE_DATADIR_EDATA);
|
||||||
UpdateDataDir('.rsrc',PE_DATADIR_RSRC);
|
UpdateDataDir('.rsrc',PE_DATADIR_RSRC);
|
||||||
UpdateDataDir('.pdata',PE_DATADIR_PDATA);
|
UpdateDataDir('.pdata',PE_DATADIR_PDATA);
|
||||||
|
Loading…
Reference in New Issue
Block a user