mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-06 19:00:04 +02:00
+ implemented reading of omf public names
git-svn-id: trunk@31311 -
This commit is contained in:
parent
7f1b21e561
commit
c50991713c
@ -123,16 +123,19 @@ interface
|
|||||||
private
|
private
|
||||||
FLNames: TOmfOrderedNameCollection;
|
FLNames: TOmfOrderedNameCollection;
|
||||||
FExtDefs: TFPHashObjectList;
|
FExtDefs: TFPHashObjectList;
|
||||||
|
FPubDefs: TFPHashObjectList;
|
||||||
FRawRecord: TOmfRawRecord;
|
FRawRecord: TOmfRawRecord;
|
||||||
|
|
||||||
function ReadLNames(RawRec: TOmfRawRecord): Boolean;
|
function ReadLNames(RawRec: TOmfRawRecord): Boolean;
|
||||||
function ReadSegDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
function ReadSegDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
||||||
function ReadGrpDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
function ReadGrpDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
||||||
function ReadExtDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
function ReadExtDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
||||||
|
function ReadPubDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
||||||
function ReadLEDataAndFixups(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
function ReadLEDataAndFixups(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
||||||
|
|
||||||
property LNames: TOmfOrderedNameCollection read FLNames;
|
property LNames: TOmfOrderedNameCollection read FLNames;
|
||||||
property ExtDefs: TFPHashObjectList read FExtDefs;
|
property ExtDefs: TFPHashObjectList read FExtDefs;
|
||||||
|
property PubDefs: TFPHashObjectList read FPubDefs;
|
||||||
public
|
public
|
||||||
constructor create;override;
|
constructor create;override;
|
||||||
destructor destroy;override;
|
destructor destroy;override;
|
||||||
@ -1098,6 +1101,53 @@ implementation
|
|||||||
Result:=True;
|
Result:=True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TOmfObjInput.ReadPubDef(RawRec: TOmfRawRecord; objdata:TObjData): Boolean;
|
||||||
|
var
|
||||||
|
PubDefRec: TOmfRecord_PUBDEF;
|
||||||
|
PubDefElem: TOmfPublicNameElement;
|
||||||
|
OldCount,NewCount,i: Integer;
|
||||||
|
objsym: TObjSymbol;
|
||||||
|
objsec: TOmfObjSection;
|
||||||
|
begin
|
||||||
|
Result:=False;
|
||||||
|
PubDefRec:=TOmfRecord_PUBDEF.Create;
|
||||||
|
PubDefRec.PublicNames:=PubDefs;
|
||||||
|
OldCount:=PubDefs.Count;
|
||||||
|
PubDefRec.DecodeFrom(RawRec);
|
||||||
|
NewCount:=PubDefs.Count;
|
||||||
|
if (PubDefRec.BaseGroupIndex<0) or (PubDefRec.BaseGroupIndex>objdata.GroupsList.Count) then
|
||||||
|
begin
|
||||||
|
InputError('Public symbol''s group name index out of range');
|
||||||
|
PubDefRec.Free;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if (PubDefRec.BaseSegmentIndex<0) or (PubDefRec.BaseSegmentIndex>objdata.ObjSectionList.Count) then
|
||||||
|
begin
|
||||||
|
InputError('Public symbol''s segment name index out of range');
|
||||||
|
PubDefRec.Free;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if PubDefRec.BaseSegmentIndex=0 then
|
||||||
|
begin
|
||||||
|
InputError('Public symbol uses absolute addressing, which is not supported by this linker');
|
||||||
|
PubDefRec.Free;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
objsec:=TOmfObjSection(objdata.ObjSectionList[PubDefRec.BaseSegmentIndex-1]);
|
||||||
|
for i:=OldCount to NewCount-1 do
|
||||||
|
begin
|
||||||
|
PubDefElem:=TOmfPublicNameElement(PubDefs[i]);
|
||||||
|
objsym:=objdata.CreateSymbol(PubDefElem.Name);
|
||||||
|
objsym.bind:=AB_GLOBAL;
|
||||||
|
objsym.typ:=AT_FUNCTION;
|
||||||
|
objsym.objsection:=objsec;
|
||||||
|
objsym.offset:=PubDefElem.PublicOffset;
|
||||||
|
objsym.size:=0;
|
||||||
|
end;
|
||||||
|
PubDefRec.Free;
|
||||||
|
Result:=True;
|
||||||
|
end;
|
||||||
|
|
||||||
function TOmfObjInput.ReadLEDataAndFixups(RawRec: TOmfRawRecord; objdata: TObjData): Boolean;
|
function TOmfObjInput.ReadLEDataAndFixups(RawRec: TOmfRawRecord; objdata: TObjData): Boolean;
|
||||||
var
|
var
|
||||||
Is32Bit: Boolean;
|
Is32Bit: Boolean;
|
||||||
@ -1168,12 +1218,14 @@ implementation
|
|||||||
cobjdata:=TOmfObjData;
|
cobjdata:=TOmfObjData;
|
||||||
FLNames:=TOmfOrderedNameCollection.Create;
|
FLNames:=TOmfOrderedNameCollection.Create;
|
||||||
FExtDefs:=TFPHashObjectList.Create;
|
FExtDefs:=TFPHashObjectList.Create;
|
||||||
|
FPubDefs:=TFPHashObjectList.Create;
|
||||||
FRawRecord:=TOmfRawRecord.Create;
|
FRawRecord:=TOmfRawRecord.Create;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TOmfObjInput.destroy;
|
destructor TOmfObjInput.destroy;
|
||||||
begin
|
begin
|
||||||
FRawRecord.Free;
|
FRawRecord.Free;
|
||||||
|
FPubDefs.Free;
|
||||||
FExtDefs.Free;
|
FExtDefs.Free;
|
||||||
FLNames.Free;
|
FLNames.Free;
|
||||||
inherited destroy;
|
inherited destroy;
|
||||||
@ -1237,9 +1289,8 @@ implementation
|
|||||||
if not ReadExtDef(FRawRecord,objdata) then
|
if not ReadExtDef(FRawRecord,objdata) then
|
||||||
exit;
|
exit;
|
||||||
RT_PUBDEF,RT_PUBDEF32:
|
RT_PUBDEF,RT_PUBDEF32:
|
||||||
begin
|
if not ReadPubDef(FRawRecord,objdata) then
|
||||||
{todo}
|
exit;
|
||||||
end;
|
|
||||||
RT_LEDATA,RT_LEDATA32:
|
RT_LEDATA,RT_LEDATA32:
|
||||||
if not ReadLEDataAndFixups(FRawRecord,objdata) then
|
if not ReadLEDataAndFixups(FRawRecord,objdata) then
|
||||||
exit;
|
exit;
|
||||||
|
Loading…
Reference in New Issue
Block a user