[project @ 2002-03-25 05:21:19 by sof]
[ghc-hetmet.git] / ghc / rts / Linker.c
index 8f259f3..7ff9b62 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Linker.c,v 1.79 2002/01/29 02:41:21 sof Exp $
+ * $Id: Linker.c,v 1.84 2002/03/25 05:21:19 sof Exp $
  *
  * (c) The GHC Team, 2000, 2001
  *
@@ -144,6 +144,7 @@ typedef struct _RtsSymbolVal {
       Sym(gmtime)                               \
       Sym(opendir)                              \
       Sym(readdir)                              \
+      Sym(rewinddir)                            \
       Sym(closedir)                             \
       Sym(__divdi3)                             \
       Sym(__udivdi3)                            \
@@ -161,7 +162,7 @@ typedef struct _RtsSymbolVal {
       Maybe_ForeignObj                         \
       Maybe_Stable_Names                       \
       Sym(StgReturn)                           \
-      Sym(__stginit_PrelGHC)                   \
+      Sym(__stginit_GHCziPrim)                 \
       Sym(init_stack)                          \
       SymX(__stg_chk_0)                                \
       SymX(__stg_chk_1)                                \
@@ -857,6 +858,10 @@ static void addSection ( ObjectCode* oc, SectionKind kind,
    s->kind      = kind;
    s->next      = oc->sections;
    oc->sections = s;
+   /* 
+   fprintf(stderr, "addSection: %p-%p (size %d), kind %d\n", 
+                   start, ((char*)end)-1, end - start + 1, kind ); 
+   */
 }
 
 
@@ -870,6 +875,33 @@ static void addSection ( ObjectCode* oc, SectionKind kind,
       and Common Object File Format Specification
       revision 5.1 January 1998
    which SimonM says comes from the MS Developer Network CDs.
+   
+   It can be found there (on older CDs), but can also be found 
+   online at:
+
+      http://www.microsoft.com/hwdev/hardware/PECOFF.asp
+
+   (this is Rev 6.0 from February 1999).
+
+   Things move, so if that fails, try searching for it via
+
+      http://www.google.com/search?q=PE+COFF+specification     
+
+   The ultimate reference for the PE format is the Winnt.h 
+   header file that comes with the Platform SDKs; as always,
+   implementations will drift wrt their documentation.
+   
+   A good background article on the PE format is Matt Pietrek's
+   March 1994 article in Microsoft System Journal (MSJ)
+   (Vol.9, No. 3): "Peering Inside the PE: A Tour of the
+   Win32 Portable Executable File Format." The info in there
+   has recently been updated in a two part article in 
+   MSDN magazine, issues Feb and March 2002,
+   "Inside Windows: An In-Depth Look into the Win32 Portable
+   Executable File Format"
+
+   John Levine's book "Linkers and Loaders" contains useful
+   info on PE too.
 */
       
 
@@ -1215,9 +1247,8 @@ ocVerifyImage_PEi386 ( ObjectCode* oc )
       if ( sectab_i->Characteristics & MYIMAGE_SCN_LNK_NRELOC_OVFL ) {
        /* If the relocation field (a short) has overflowed, the
         * real count can be found in the first reloc entry.
-        * The PE spec (Rev 6.0) doesn't really cover this,
-        * but as always header files provide the final word on
-        * details like this (cf. WinNT.h).
+        * 
+        * See Section 4.1 (last para) of the PE spec (rev6.0).
         */
         COFF_reloc* rel = (COFF_reloc*)
                            myindex ( sizeof_COFF_reloc, reltab, 0 );
@@ -1526,9 +1557,8 @@ ocResolve_PEi386 ( ObjectCode* oc )
       if ( sectab_i->Characteristics & MYIMAGE_SCN_LNK_NRELOC_OVFL ) {
        /* If the relocation field (a short) has overflowed, the
         * real count can be found in the first reloc entry.
-        * The PE spec (Feb 99 version) doesn't really cover this,
-        * but as always header files provide the final word on
-        * details like this (cf. WinNT.h).
+         *
+        * See Section 4.1 (last para) of the PE spec (rev6.0).
         */
         COFF_reloc* rel = (COFF_reloc*)
                            myindex ( sizeof_COFF_reloc, reltab, 0 );
@@ -1911,10 +1941,11 @@ ocGetNames_ELF ( ObjectCode* oc )
       }
 
       /* fill in the section info */
-      addSection(oc, kind, ehdrC + shdr[i].sh_offset, 
-                     ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1);
-      if (kind != SECTIONKIND_OTHER && shdr[i].sh_size > 0)
+      if (kind != SECTIONKIND_OTHER && shdr[i].sh_size > 0) {
          addProddableBlock(oc, ehdrC + shdr[i].sh_offset, shdr[i].sh_size);
+         addSection(oc, kind, ehdrC + shdr[i].sh_offset, 
+                        ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1);
+      }
 
       if (shdr[i].sh_type != SHT_SYMTAB) continue;