Enhance GenFw to support handling the shared ELF object file. This is helpful to...
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 30 Jun 2008 06:11:50 +0000 (06:11 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Mon, 30 Jun 2008 06:11:50 +0000 (06:11 +0000)
[Background]
The UnixPkg provide an simulator in *unix. To support source level debug, we need dynamically load all of modules using dlopen(). This requires the output of compiler must be a shared ELF object. Therefore the GenFw should be able to handle the kind of object to generate .efi PE file.

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1271 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenFw/GenFw.c

index eb4b6eb..a61dad0 100644 (file)
@@ -485,7 +485,7 @@ CheckElfHeader(
     return 0;\r
   if (Ehdr->e_ident[EI_DATA] != ELFDATA2LSB)\r
     return 0;\r
-  if (Ehdr->e_type != ET_EXEC)\r
+  if ((Ehdr->e_type != ET_EXEC) && (Ehdr->e_type != ET_DYN))\r
     return 0;\r
   if (Ehdr->e_machine != EM_386)\r
     return 0;\r
@@ -508,7 +508,28 @@ IsTextShdr(
   Elf_Shdr *Shdr\r
   )\r
 {\r
-  return (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC;\r
+  int Status;\r
+  int NotText = 1;\r
+  Status = (int)((Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == SHF_ALLOC);\r
+  if (Ehdr->e_type == ET_EXEC)\r
+    return Status;\r
+  else {\r
+    //\r
+    // this is a shared object file.\r
+    //\r
+    switch (Shdr->sh_type) {\r
+      case SHT_HASH:\r
+      case SHT_DYNSYM:\r
+      case SHT_STRTAB:\r
+      case SHT_REL:\r
+      case SHT_GNU_HASH:\r
+        NotText = 0;\r
+        break;\r
+      default:\r
+        break;\r
+    }\r
+    return Status && NotText;\r
+  }\r
 }\r
 \r
 int\r
@@ -516,7 +537,9 @@ IsDataShdr(
   Elf_Shdr *Shdr\r
   )\r
 {\r
-  return (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE);\r
+  int Status;\r
+  Status = (Shdr->sh_flags & (SHF_WRITE | SHF_ALLOC)) == (SHF_ALLOC | SHF_WRITE);\r
+  return Status && !(Shdr->sh_type == (SHT_DYNAMIC));\r
 }\r
 \r
 VOID\r