base: Add byte order attribute for object files
authorSandipan Das <sandipan@linux.ibm.com>
Sat, 6 Feb 2021 11:57:32 +0000 (17:27 +0530)
committerSandipan Das <sandipan@linux.ibm.com>
Mon, 15 Feb 2021 08:32:38 +0000 (14:02 +0530)
This adds byte order as an attribute for object files by
introducing new members to the ObjectFile class. This is
populated by the looking at the ELF headers.

Change-Id: Ibe55699175cc0295e0c9d49bdbe02e580988bc4f
Signed-off-by: Sandipan Das <sandipan@linux.ibm.com>
src/base/loader/elf_object.cc
src/base/loader/elf_object.hh
src/base/loader/object_file.hh

index bdcc92b2c0651a431b20df90038e75966b80d332..4198875361a6b900c9ff76add03af1e81f69ac37 100644 (file)
@@ -112,6 +112,7 @@ ElfObject::ElfObject(ImageFileDataPtr ifd) : ObjectFile(ifd)
 
     determineArch();
     determineOpSys();
+    determineByteOrder();
 
     entry = ehdr.e_entry;
     _programHeaderCount = ehdr.e_phnum;
@@ -323,6 +324,15 @@ ElfObject::determineOpSys()
     }
 }
 
+void
+ElfObject::determineByteOrder()
+{
+    auto edata = ehdr.e_ident[EI_DATA];
+    if (edata == ELFDATANONE)
+        panic("invalid ELF data encoding");
+    byteOrder = (edata == ELFDATA2MSB) ? ByteOrder::big : ByteOrder::little;
+}
+
 void
 ElfObject::handleLoadableSegment(GElf_Phdr phdr, int seg_num)
 {
index c262912af598d74c2d2eb4754af86a8d152d3b4f..24d0c0c6cb4634e943001d969ee48504e5ee3907 100644 (file)
@@ -64,6 +64,7 @@ class ElfObject : public ObjectFile
 
     void determineArch();
     void determineOpSys();
+    void determineByteOrder();
     void handleLoadableSegment(GElf_Phdr phdr, int seg_num);
 
     // These values are provided to a linux process by the kernel, so we
index 0bfd918e8191391161e4d03ac27d61e9833ca926..7d542a98e3c6413510c5161d39cdcb9c4a2afe59 100644 (file)
@@ -37,6 +37,7 @@
 #include "base/loader/symtab.hh"
 #include "base/logging.hh"
 #include "base/types.hh"
+#include "enums/ByteOrder.hh"
 
 namespace Loader
 {
@@ -76,6 +77,7 @@ class ObjectFile : public ImageFile
   protected:
     Arch arch = UnknownArch;
     OpSys opSys = UnknownOpSys;
+    ByteOrder byteOrder = ByteOrder::little;
 
     SymbolTable _symtab;
 
@@ -102,6 +104,7 @@ class ObjectFile : public ImageFile
 
     Arch  getArch()  const { return arch; }
     OpSys getOpSys() const { return opSys; }
+    ByteOrder getByteOrder() const { return byteOrder; }
 
     const SymbolTable &symtab() const { return _symtab; }