mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-15 18:19:45 +02:00
+ Implemented two-stage removal of empty exe sections. Candidates for removal are first marked with oso_disabled flag, then actually removed. Descendants of TExeOutput that override MemPos_Start may modify list of sections pending removal. In particular, the COFF-specific .reloc section no longer has to be handled in base TExeOutput class.
git-svn-id: trunk@21971 -
This commit is contained in:
parent
3d19605fc2
commit
1d09005542
@ -1295,7 +1295,7 @@ Implementation
|
||||
{ if UseStabs then, this would remove
|
||||
STABS for empty linker scripts }
|
||||
exeoutput.MergeStabs;
|
||||
exeoutput.RemoveEmptySections;
|
||||
exeoutput.MarkEmptySections;
|
||||
if ErrorCount>0 then
|
||||
goto myexit;
|
||||
|
||||
|
@ -131,7 +131,9 @@ interface
|
||||
{ Contains debug info and can be stripped }
|
||||
oso_debug,
|
||||
{ Contains only strings }
|
||||
oso_strings
|
||||
oso_strings,
|
||||
{ Ignore this section }
|
||||
oso_disabled
|
||||
);
|
||||
|
||||
TObjSectionOptions = set of TObjSectionOption;
|
||||
@ -488,8 +490,9 @@ interface
|
||||
procedure FixupRelocations;
|
||||
procedure RemoveUnusedExeSymbols;
|
||||
procedure MergeStabs;
|
||||
procedure MarkEmptySections;
|
||||
procedure RemoveUnreferencedSections;
|
||||
procedure RemoveEmptySections;
|
||||
procedure RemoveDisabledSections;
|
||||
procedure RemoveDebugInfo;
|
||||
procedure GenerateLibraryImports(ImportLibraryList:TFPHashObjectList);virtual;
|
||||
procedure GenerateDebugLink(const dbgname:string;dbgcrc:cardinal);
|
||||
@ -1898,6 +1901,7 @@ implementation
|
||||
procedure TExeOutput.MemPos_Start;
|
||||
begin
|
||||
CurrMemPos:=0;
|
||||
RemoveDisabledSections;
|
||||
end;
|
||||
|
||||
|
||||
@ -2657,7 +2661,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure TExeOutput.RemoveEmptySections;
|
||||
procedure TExeOutput.MarkEmptySections;
|
||||
var
|
||||
i, j : longint;
|
||||
exesec : TExeSection;
|
||||
@ -2687,12 +2691,26 @@ implementation
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
if doremove and not (RelocSection and (exesec.Name='.reloc')) then
|
||||
if doremove then
|
||||
begin
|
||||
Comment(V_Debug,'Deleting empty section '+exesec.name);
|
||||
ExeSectionList[i]:=nil;
|
||||
Comment(V_Debug,'Disabling empty section '+exesec.name);
|
||||
exesec.SecOptions:=exesec.SecOptions+[oso_disabled];
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure TExeOutput.RemoveDisabledSections;
|
||||
var
|
||||
i: longint;
|
||||
exesec: TExeSection;
|
||||
begin
|
||||
for i:=0 to ExeSectionList.Count-1 do
|
||||
begin
|
||||
exesec:=TExeSection(ExeSectionList[i]);
|
||||
if (oso_disabled in exesec.SecOptions) then
|
||||
ExeSectionList[i]:=nil;
|
||||
end;
|
||||
ExeSectionList.Pack;
|
||||
end;
|
||||
|
||||
|
@ -226,7 +226,7 @@ interface
|
||||
public
|
||||
constructor create;override;
|
||||
procedure GenerateLibraryImports(ImportLibraryList:TFPHashObjectList);override;
|
||||
procedure Order_End;override;
|
||||
procedure MemPos_Start;override;
|
||||
procedure MemPos_ExeSection(const aname:string);override;
|
||||
end;
|
||||
|
||||
@ -2656,7 +2656,7 @@ const pemagic : array[0..3] of byte = (
|
||||
exesec:=FindExeSection('.reloc');
|
||||
if exesec=nil then
|
||||
exit;
|
||||
objsec:=internalObjData.createsection('.reloc',0,exesec.SecOptions+[oso_data]);
|
||||
objsec:=internalObjData.createsection('.reloc',0,[oso_data,oso_load,oso_keep]);
|
||||
exesec.AddObjSection(objsec);
|
||||
pgaddr:=longword(-1);
|
||||
hdrpos:=longword(-1);
|
||||
@ -2702,17 +2702,18 @@ const pemagic : array[0..3] of byte = (
|
||||
end;
|
||||
|
||||
|
||||
procedure TPECoffexeoutput.Order_End;
|
||||
procedure TPECoffexeoutput.MemPos_Start;
|
||||
var
|
||||
exesec : TExeSection;
|
||||
begin
|
||||
if RelocSection then
|
||||
begin
|
||||
exesec:=FindExeSection('.reloc');
|
||||
if exesec=nil then
|
||||
InternalError(2012072401);
|
||||
exesec.SecOptions:=exesec.SecOptions-[oso_disabled];
|
||||
end;
|
||||
inherited;
|
||||
if not IsSharedLibrary then
|
||||
exit;
|
||||
exesec:=FindExeSection('.reloc');
|
||||
if exesec=nil then
|
||||
exit;
|
||||
exesec.SecOptions:=exesec.SecOptions + [oso_Data,oso_keep,oso_load];
|
||||
end;
|
||||
|
||||
|
||||
|
@ -281,7 +281,7 @@ const NLM_MAX_DESCRIPTION_LENGTH = 127;
|
||||
procedure DataPos_Header;override;
|
||||
procedure fillNlmVersionHeader;
|
||||
procedure GenerateLibraryImports(ImportLibraryList:TFPHashObjectList);override;
|
||||
procedure Order_End;override;
|
||||
procedure MemPos_Start;override;
|
||||
procedure MemPos_ExeSection(const aname:string);override;
|
||||
procedure DataPos_ExeSection(const aname:string);override;
|
||||
procedure NLMwriteString (const s : string; terminateWithZero : boolean);
|
||||
@ -1172,7 +1172,7 @@ function SecOpts(SecOptions:TObjSectionOptions):string;
|
||||
exesec:=FindExeSection('.reloc');
|
||||
if exesec=nil then
|
||||
exit;
|
||||
objsec:=internalObjData.createsection('.reloc',0,exesec.SecOptions+[oso_data]);
|
||||
objsec:=internalObjData.createsection('.reloc',0,[oso_data,oso_load,oso_keep]);
|
||||
exesec.AddObjSection(objsec);
|
||||
for i:=0 to ExeSectionList.Count-1 do
|
||||
begin
|
||||
@ -1227,15 +1227,15 @@ function SecOpts(SecOptions:TObjSectionOptions):string;
|
||||
end;
|
||||
|
||||
|
||||
procedure TNLMexeoutput.Order_End;
|
||||
procedure TNLMexeoutput.MemPos_Start;
|
||||
var
|
||||
exesec : TExeSection;
|
||||
begin
|
||||
inherited;
|
||||
exesec:=FindExeSection('.reloc');
|
||||
if exesec=nil then
|
||||
exit;
|
||||
exesec.SecOptions:=exesec.SecOptions + [oso_Data,oso_keep,oso_load];
|
||||
InternalError(2012072602);
|
||||
exesec.SecOptions:=exesec.SecOptions-[oso_disabled];
|
||||
inherited;
|
||||
end;
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user