* 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:
sergei 2012-12-08 11:26:38 +00:00
parent 7c128f6556
commit a7eab8ff67

View File

@ -142,6 +142,8 @@ interface
destructor Destroy;override;
function ReadObjData(AReader:TObjectreader;out objdata:TObjData):boolean;override;
class function CanReadObjData(AReader:TObjectreader):boolean;override;
function CreateSection(const shdr:TElfsechdr;index:longint;objdata:TObjData;
out secname:string):TElfObjSection;
end;
TRelocNameProc=function(reltyp:byte):string;
@ -1318,6 +1320,22 @@ implementation
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);
var
sec: TElfObjSection;
@ -1333,12 +1351,10 @@ implementation
{ SHT_STRTAB may appear for .stabstr and other debug sections.
.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
secname:=string(PChar(@shstrtab[shdr.sh_name]));
sec:=TElfObjSection.create_ext(objdata,secname,
shdr.sh_type,shdr.sh_flags,shdr.sh_addralign,shdr.sh_entsize);
sec:=CreateSection(shdr,index,objdata,secname);
if (Length(secname)>3) and (secname[2] in ['d','f','n','s']) then
begin
@ -1360,12 +1376,6 @@ implementation
if (shdr.sh_type=SHT_NOTE) and (shdr.sh_size<>0) then
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;
SHT_REL,SHT_RELA: