summaryrefslogtreecommitdiff
path: root/compiler/ogbase.pas
diff options
context:
space:
mode:
authorsergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2012-07-25 11:08:54 +0000
committersergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2012-07-25 11:08:54 +0000
commitef08632630b25cd0c1578b43d1786a20b5483334 (patch)
tree95ed478e690f2bde8f7e1e7ba5ac7f7b95d35e2b /compiler/ogbase.pas
parenta69fe0e7894a46b7c5d9f23f3d63ce324789a17c (diff)
downloadfpc-ef08632630b25cd0c1578b43d1786a20b5483334.tar.gz
+ Basic executable stack support in TExeOutput.
+ Two stubs (TExeOutput.Load_DynamicObject and TObjInput.CanReadObjData) to override in ELF linker. + Stop linking if errors were detected while loading object files. * Changed TStaticLibrary to TObject. It is never looked up by name, so hashing is redundant; moreover its name has been changed to TCmdStr, which may be trimmed by TFPHashList. git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@21968 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/ogbase.pas')
-rw-r--r--compiler/ogbase.pas29
1 files changed, 23 insertions, 6 deletions
diff --git a/compiler/ogbase.pas b/compiler/ogbase.pas
index 6db26c343a..dee5da250d 100644
--- a/compiler/ogbase.pas
+++ b/compiler/ogbase.pas
@@ -240,6 +240,7 @@ interface
property CObjSection:TObjSectionClass read FCObjSection write FCObjSection;
public
CurrPass : byte;
+ ExecStack : boolean;
constructor create(const n:string);virtual;
destructor destroy;override;
{ Sections }
@@ -312,6 +313,7 @@ interface
destructor destroy;override;
function newObjData(const n:string):TObjData;
function ReadObjData(AReader:TObjectreader;Data:TObjData):boolean;virtual;abstract;
+ class function CanReadObjData(AReader:TObjectreader):boolean;virtual;
procedure inputerror(const s : string);
end;
TObjInputClass=class of TObjInput;
@@ -368,12 +370,13 @@ interface
end;
TExeSectionClass=class of TExeSection;
- TStaticLibrary = class(TFPHashObject)
+ TStaticLibrary = class(TObject)
private
+ FName : TCmdStr;
FArReader : TObjectReader;
FObjInputClass : TObjInputClass;
public
- constructor create(AList:TFPHashObjectList;const AName:string;AReader:TObjectReader;AObjInputClass:TObjInputClass);
+ constructor create(const AName:TCmdStr;AReader:TObjectReader;AObjInputClass:TObjInputClass);
destructor destroy;override;
property ArReader:TObjectReader read FArReader;
property ObjInputClass:TObjInputClass read FObjInputClass;
@@ -444,6 +447,7 @@ interface
CurrDataPos : aword;
MaxMemPos : qword;
IsSharedLibrary : boolean;
+ ExecStack : boolean;
constructor create;virtual;
destructor destroy;override;
function FindExeSection(const aname:string):TExeSection;
@@ -454,6 +458,7 @@ interface
procedure Load_ProvideSymbol(const aname:string);virtual;
procedure Load_IsSharedLibrary;
procedure Load_ImageBase(const avalue:string);
+ procedure Load_DynamicObject(ObjData:TObjData);virtual;
procedure Order_Start;virtual;
procedure Order_End;virtual;
procedure Order_ExeSection(const aname:string);virtual;
@@ -477,7 +482,7 @@ interface
procedure DataPos_Symbols;virtual;
procedure BuildVTableTree(VTInheritList,VTEntryList:TFPObjectList);
procedure PackUnresolvedExeSymbols(const s:string);
- procedure ResolveSymbols(StaticLibraryList:TFPHashObjectList);
+ procedure ResolveSymbols(StaticLibraryList:TFPObjectList);
procedure PrintMemoryMap;
procedure FixupSymbols;
procedure FixupRelocations;
@@ -1456,9 +1461,9 @@ implementation
TStaticLibrary
****************************************************************************}
- constructor TStaticLibrary.create(AList:TFPHashObjectList;const AName:string;AReader:TObjectReader;AObjInputClass:TObjInputClass);
+ constructor TStaticLibrary.create(const AName:TCmdStr;AReader:TObjectReader;AObjInputClass:TObjInputClass);
begin
- inherited create(AList,AName);
+ FName:=AName;
FArReader:=AReader;
FObjInputClass:=AObjInputClass;
end;
@@ -1595,6 +1600,7 @@ implementation
if ObjData.classtype<>FCObjData then
Comment(V_Error,'Invalid input object format for '+ObjData.name+' got '+ObjData.classname+' expected '+FCObjData.classname);
ObjDataList.Add(ObjData);
+ ExecStack:=ExecStack or ObjData.ExecStack;
end;
@@ -1660,6 +1666,11 @@ implementation
end;
+ procedure TExeOutput.Load_DynamicObject(ObjData:TObjData);
+ begin
+ end;
+
+
procedure TExeOutput.Order_Start;
begin
end;
@@ -2079,7 +2090,7 @@ implementation
end;
- procedure TExeOutput.ResolveSymbols(StaticLibraryList:TFPHashObjectList);
+ procedure TExeOutput.ResolveSymbols(StaticLibraryList:TFPObjectList);
var
ObjData : TObjData;
exesym : TExeSymbol;
@@ -2987,6 +2998,12 @@ implementation
end;
+ class function TObjInput.CanReadObjData(AReader:TObjectReader):boolean;
+ begin
+ result:=false;
+ end;
+
+
procedure TObjInput.ReadSectionContent(Data:TObjData);
var
i: longint;