[project @ 2005-02-19 18:51:19 by desrt]
authordesrt <unknown>
Sat, 19 Feb 2005 18:51:19 +0000 (18:51 +0000)
committerdesrt <unknown>
Sat, 19 Feb 2005 18:51:19 +0000 (18:51 +0000)
Linker.c: ELF: Added two utility functions findElfSectionIndexByName
               and findElfSectionByName that are used by the PPC64 linker
               currently being worked on.  These functions should be used
               in other (generic) ELF code too.

ghc/rts/Linker.c

index 7b9df7f..5ea9d4e 100644 (file)
@@ -2441,6 +2441,65 @@ findElfSection ( void* objImage, Elf_Word sh_type )
    return ptr;
 }
 
+static int
+findElfSectionIndexByName( ObjectCode *oc, const char *sh_name,
+                           Elf_Word expected_type, Elf_Word expected_entsize )
+{
+  Elf_Ehdr *ehdr = (Elf_Ehdr *) oc->image;
+  Elf_Shdr *shdr = (Elf_Shdr *) (oc->image + ehdr->e_shoff);
+  char *sectnames = oc->image + shdr[ehdr->e_shstrndx].sh_offset;
+  int i;
+
+  for( i = 0; i < ehdr->e_shnum; i++ )
+    if( !strcmp( sectnames + shdr[i].sh_name, sh_name ) )
+    {
+      if( shdr[i].sh_type != expected_type )
+      {
+        errorBelch( "The entry type (%d) of the '%s' section isn't %d\n",
+                    shdr[i].sh_type, sh_name, expected_type );
+        return -1;
+      }
+
+      if( shdr[i].sh_entsize != expected_entsize )
+      {
+        errorBelch( "The entry size (%d) of the '%s' section isn't %d\n",
+                    shdr[i].sh_entsize, sh_name, expected_entsize );
+
+        return -1;
+      }
+
+      return i;
+    }
+
+  errorBelch( "This ELF file contains no '%s' section", sh_name );
+  return -1;
+}
+
+static char *
+findElfSectionByName( ObjectCode *oc, const char *sh_name,
+                      Elf_Word expected_type, int expected_entsize,
+                      int *num_entries )
+{
+  Elf_Ehdr *ehdr = (Elf_Ehdr *) oc->image;
+  Elf_Shdr *shdr = (Elf_Shdr *) (oc->image + ehdr->e_shoff);
+  int section;
+
+  section = findElfSectionIndexByName( oc, sh_name, expected_type,
+                                       expected_entsize );
+
+  if( section < 0 )
+    return NULL;
+
+  /* allow for meaningful results in num_entries even when entsize is 0 */
+  if( expected_entsize == 0 )
+    expected_entsize = 1;
+
+  if( num_entries )
+    *num_entries = shdr[section].sh_size / expected_entsize;
+
+  return oc->image + shdr[section].sh_offset;
+}
+
 #if defined(ia64_HOST_ARCH)
 static Elf_Addr
 findElfSegment ( void* objImage, Elf_Addr vaddr )