mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-19 00:49:09 +02:00
* TElfObjInput: Factored section creation code into separate method which can be called by CPU-specific routines.
+ Load SHT_INIT_ARRAY,SHT_FINI_ARRAY,SHT_PREINIT_ARRAY section types. git-svn-id: trunk@23124 -
This commit is contained in:
parent
7c128f6556
commit
a7eab8ff67
@ -142,6 +142,8 @@ interface
|
|||||||
destructor Destroy;override;
|
destructor Destroy;override;
|
||||||
function ReadObjData(AReader:TObjectreader;out objdata:TObjData):boolean;override;
|
function ReadObjData(AReader:TObjectreader;out objdata:TObjData):boolean;override;
|
||||||
class function CanReadObjData(AReader:TObjectreader):boolean;override;
|
class function CanReadObjData(AReader:TObjectreader):boolean;override;
|
||||||
|
function CreateSection(const shdr:TElfsechdr;index:longint;objdata:TObjData;
|
||||||
|
out secname:string):TElfObjSection;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TRelocNameProc=function(reltyp:byte):string;
|
TRelocNameProc=function(reltyp:byte):string;
|
||||||
@ -1318,6 +1320,22 @@ implementation
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function TElfObjInput.CreateSection(const shdr:TElfsechdr;index:longint;objdata:tobjdata;
|
||||||
|
out secname:string):TElfObjSection;
|
||||||
|
begin
|
||||||
|
secname:=string(PChar(@shstrtab[shdr.sh_name]));
|
||||||
|
|
||||||
|
result:=TElfObjSection.create_ext(objdata,secname,
|
||||||
|
shdr.sh_type,shdr.sh_flags,shdr.sh_addralign,shdr.sh_entsize);
|
||||||
|
|
||||||
|
result.index:=index;
|
||||||
|
result.DataPos:=shdr.sh_offset;
|
||||||
|
result.MemPos:=shdr.sh_addr;
|
||||||
|
result.Size:=shdr.sh_size;
|
||||||
|
FSecTbl[index].sec:=result;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure TElfObjInput.LoadSection(const shdr:TElfsechdr;index:longint;objdata:tobjdata);
|
procedure TElfObjInput.LoadSection(const shdr:TElfsechdr;index:longint;objdata:tobjdata);
|
||||||
var
|
var
|
||||||
sec: TElfObjSection;
|
sec: TElfObjSection;
|
||||||
@ -1333,12 +1351,10 @@ implementation
|
|||||||
|
|
||||||
{ SHT_STRTAB may appear for .stabstr and other debug sections.
|
{ SHT_STRTAB may appear for .stabstr and other debug sections.
|
||||||
.shstrtab and .strtab are processed separately and don't appear here. }
|
.shstrtab and .strtab are processed separately and don't appear here. }
|
||||||
SHT_PROGBITS,SHT_NOBITS,SHT_NOTE,SHT_STRTAB:
|
SHT_PROGBITS,SHT_NOBITS,SHT_NOTE,SHT_STRTAB,
|
||||||
|
SHT_INIT_ARRAY,SHT_FINI_ARRAY,SHT_PREINIT_ARRAY:
|
||||||
begin
|
begin
|
||||||
secname:=string(PChar(@shstrtab[shdr.sh_name]));
|
sec:=CreateSection(shdr,index,objdata,secname);
|
||||||
|
|
||||||
sec:=TElfObjSection.create_ext(objdata,secname,
|
|
||||||
shdr.sh_type,shdr.sh_flags,shdr.sh_addralign,shdr.sh_entsize);
|
|
||||||
|
|
||||||
if (Length(secname)>3) and (secname[2] in ['d','f','n','s']) then
|
if (Length(secname)>3) and (secname[2] in ['d','f','n','s']) then
|
||||||
begin
|
begin
|
||||||
@ -1360,12 +1376,6 @@ implementation
|
|||||||
|
|
||||||
if (shdr.sh_type=SHT_NOTE) and (shdr.sh_size<>0) then
|
if (shdr.sh_type=SHT_NOTE) and (shdr.sh_size<>0) then
|
||||||
sec.SecOptions:=[oso_keep];
|
sec.SecOptions:=[oso_keep];
|
||||||
|
|
||||||
sec.index:=index;
|
|
||||||
sec.DataPos:=shdr.sh_offset;
|
|
||||||
sec.MemPos:=shdr.sh_addr;
|
|
||||||
sec.Size:=shdr.sh_size;
|
|
||||||
FSecTbl[index].sec:=sec;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
SHT_REL,SHT_RELA:
|
SHT_REL,SHT_RELA:
|
||||||
|
Loading…
Reference in New Issue
Block a user