Browse Source

* Moved TElfsechdr into interface and cleaned up some ugliness in TElfObjInput code caused by TElfsechdr being not publicly available. Providing target-specific section loading becomes easier now as well.

git-svn-id: trunk@23087 -
sergei 12 years ago
parent
commit
006d795797
1 changed files with 16 additions and 11 deletions
  1. 16 11
      compiler/ogelf.pas

+ 16 - 11
compiler/ogelf.pas

@@ -39,6 +39,12 @@ interface
        owbase;
 
     type
+{$ifdef cpu64bitaddr}
+      TElfsechdr = TElf64sechdr;
+{$else cpu64bitaddr}
+      TElfsechdr = TElf32sechdr;
+{$endif cpu64bitaddr}
+
        TElfObjSection = class(TObjSection)
        public
           shstridx,
@@ -112,11 +118,14 @@ interface
          relentsize: longint;
        end;
 
+       TElfsecheaderarray=array of TElfsechdr;
+
        TElfObjInput=class(TObjInput)
        private
          FSecTbl: PSectionRec;
          FSymTbl: PPointer;
          FLoaded: PBoolean;
+         shdrs: TElfsecheaderarray;
          nsects: longword;
          shentsize: longword;
          shoffset: aword;
@@ -132,10 +141,10 @@ interface
          symversions: PWord;
          dynobj: boolean;
          function LoadHeader:word;
-         procedure LoadSection(const hdr;index:longint;objdata:TObjData);
+         procedure LoadSection(const shdr:TElfsechdr;index:longint;objdata:TObjData);
          procedure LoadRelocations(const secrec:TSectionRec);
          procedure LoadSymbols(objdata:TObjData;count,locals:longword);
-         procedure LoadDynamic(const hdr;objdata:TObjData);
+         procedure LoadDynamic(const shdr:TElfsechdr;objdata:TObjData);
        public
          constructor Create;override;
          destructor Destroy;override;
@@ -308,7 +317,6 @@ implementation
         telfheader = telf64header;
         telfreloc = telf64reloc;
         telfsymbol = telf64symbol;
-        telfsechdr = telf64sechdr;
         telfproghdr = telf64proghdr;
         telfdyn = telf64dyn;
 
@@ -324,7 +332,6 @@ implementation
         telfheader = telf32header;
         telfreloc = telf32reloc;
         telfsymbol = telf32symbol;
-        telfsechdr = telf32sechdr;
         telfproghdr = telf32proghdr;
         telfdyn = telf32dyn;
 
@@ -1342,13 +1349,15 @@ implementation
       end;
 
 
-    procedure TElfObjInput.LoadSection(const hdr;index:longint;objdata:tobjdata);
+    procedure TElfObjInput.LoadSection(const shdr:TElfsechdr;index:longint;objdata:tobjdata);
       var
-        shdr: TElfsechdr absolute hdr;
         sec: TElfObjSection;
         sym: TElfSymbol;
         secname: string;
       begin
+        if shdr.sh_name>=shstrtablen then
+          InternalError(2012060210);
+
         case shdr.sh_type of
           SHT_NULL:
             {ignore};
@@ -1357,8 +1366,6 @@ implementation
             .shstrtab and .strtab are processed separately and don't appear here. }
           SHT_PROGBITS,SHT_NOBITS,SHT_NOTE,SHT_STRTAB:
             begin
-              if shdr.sh_name>=shstrtablen then
-                InternalError(2012060210);
               secname:=string(PChar(@shstrtab[shdr.sh_name]));
 
               sec:=TElfObjSection.create_ext(objdata,secname,
@@ -1503,9 +1510,8 @@ implementation
       end;
 
 
-    procedure TElfObjInput.LoadDynamic(const hdr;objdata:TObjData);
+    procedure TElfObjInput.LoadDynamic(const shdr:TElfsechdr;objdata:TObjData);
       var
-        shdr: TElfsechdr absolute hdr;
         dt: TElfDyn;
         i: longint;
       begin
@@ -1534,7 +1540,6 @@ implementation
         i,j,strndx,dynndx,
         versymndx,verdefndx,verneedndx: longint;
         objsec: TObjSection;
-        shdrs: array of TElfsechdr;
         grp: TObjSectionGroup;
         tmp: longword;
         count: longint;