[project @ 2002-07-18 06:05:29 by sof]
[ghc-hetmet.git] / ghc / rts / Linker.c
index 2758ecb..f742749 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Linker.c,v 1.96 2002/06/15 19:38:11 wolfgang Exp $
+ * $Id: Linker.c,v 1.100 2002/07/18 06:05:29 sof Exp $
  *
  * (c) The GHC Team, 2000, 2001
  *
@@ -24,6 +24,9 @@
 #include <sys/types.h>
 #endif
 
+#include <stdlib.h>
+#include <string.h>
+
 #ifdef HAVE_SYS_STAT_H
 #include <sys/stat.h>
 #endif
@@ -59,6 +62,7 @@
 #elif defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS)
 #  define OBJFORMAT_PEi386
 #  include <windows.h>
+#  include <math.h>
 #elif defined(darwin_TARGET_OS)
 #  define OBJFORMAT_MACHO
 #  include <mach-o/loader.h>
@@ -210,7 +214,6 @@ typedef struct _RtsSymbolVal {
    executable, so we have to employ this hack. */
 #define RTS_MINGW_ONLY_SYMBOLS                  \
       SymX(memset)                              \
-      SymX(memset)                              \
       SymX(inet_ntoa)                           \
       SymX(inet_addr)                           \
       SymX(htonl)                               \
@@ -286,7 +289,6 @@ typedef struct _RtsSymbolVal {
       Maybe_ForeignObj                         \
       Maybe_Stable_Names                       \
       Sym(StgReturn)                           \
-      Sym(__stginit_GHCziPrim)                 \
       Sym(init_stack)                          \
       SymX(__stg_chk_0)                                \
       SymX(__stg_chk_1)                                \
@@ -508,7 +510,8 @@ typedef struct _RtsSymbolVal {
       Sym(__umoddi3)                                                   \
          Sym(__ashldi3)                                                        \
          Sym(__ashrdi3)                                                        \
-         Sym(__lshrdi3)
+         Sym(__lshrdi3)                                                        \
+         SymX(__eprintf)
 #else
 #define RTS_EXTRA_SYMBOLS /* nothing */
 #endif
@@ -2845,6 +2848,7 @@ static int ocVerifyImage_MachO(ObjectCode* oc)
 }
 
 static void resolveImports(
+    ObjectCode* oc,
     char *image,
     struct symtab_command *symLC,
     struct section *sect,    // ptr to lazy or non-lazy symbol pointer section
@@ -2863,6 +2867,8 @@ static void resolveImports(
        if((symbol->n_type & N_TYPE) == N_UNDF
            && (symbol->n_type & N_EXT) && (symbol->n_value != 0))
            addr = (void*) (symbol->n_value);
+       else if((addr = lookupLocalSymbol(oc,nm)) != NULL)
+           ;
        else
            addr = lookupSymbol(nm);
        if(!addr)
@@ -2934,7 +2940,7 @@ static void relocateSection(char *image,
                {
                    struct nlist *symbol = &nlist[reloc->r_symbolnum];
                    char *nm = image + symLC->stroff + symbol->n_un.n_strx;
-                   *word = lookupSymbol(nm);
+                   *word = (unsigned long) (lookupSymbol(nm));
                    ASSERT(*word);
                }
                continue;
@@ -2951,7 +2957,7 @@ static int ocGetNames_MachO(ObjectCode* oc)
     char *image = (char*) oc->image;
     struct mach_header *header = (struct mach_header*) image;
     struct load_command *lc = (struct load_command*) (image + sizeof(struct mach_header));
-    int i,curSymbol;
+    unsigned i,curSymbol;
     struct segment_command *segLC = NULL;
     struct section *sections, *la_ptrs = NULL, *nl_ptrs = NULL;
     struct symtab_command *symLC = NULL;
@@ -3030,6 +3036,20 @@ static int ocGetNames_MachO(ObjectCode* oc)
        }
     }
     
+       // insert local symbols into lochash
+    for(i=dsymLC->ilocalsym;i<dsymLC->ilocalsym+dsymLC->nlocalsym;i++)
+    {
+       if((nlist[i].n_type & N_TYPE) == N_SECT)
+       {
+           char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
+           ghciInsertStrHashTable(oc->fileName, oc->lochash, nm, image + 
+               sections[nlist[i].n_sect-1].offset
+               - sections[nlist[i].n_sect-1].addr
+               + nlist[i].n_value);
+       }
+    }
+
+    
     commonStorage = stgCallocBytes(1,commonSize,"ocGetNames_MachO(common symbols)");
     commonCounter = (unsigned long)commonStorage;
     for(i=0;i<symLC->nsyms;i++)
@@ -3042,7 +3062,7 @@ static int ocGetNames_MachO(ObjectCode* oc)
            
            nlist[i].n_value = commonCounter;
            
-           ghciInsertStrHashTable(oc->fileName, symhash, nm, nlist[i].n_value);
+           ghciInsertStrHashTable(oc->fileName, symhash, nm, (void*)commonCounter);
            oc->symbols[curSymbol++] = nm;
            
            commonCounter += sz;
@@ -3056,7 +3076,7 @@ static int ocResolve_MachO(ObjectCode* oc)
     char *image = (char*) oc->image;
     struct mach_header *header = (struct mach_header*) image;
     struct load_command *lc = (struct load_command*) (image + sizeof(struct mach_header));
-    int i;
+    unsigned i;
     struct segment_command *segLC = NULL;
     struct section *sections, *la_ptrs = NULL, *nl_ptrs = NULL;
     struct symtab_command *symLC = NULL;
@@ -3089,9 +3109,9 @@ static int ocResolve_MachO(ObjectCode* oc)
     indirectSyms = (unsigned long*) (image + dsymLC->indirectsymoff);
 
     if(la_ptrs)
-       resolveImports(image,symLC,la_ptrs,indirectSyms,nlist);
+       resolveImports(oc,image,symLC,la_ptrs,indirectSyms,nlist);
     if(nl_ptrs)
-       resolveImports(image,symLC,nl_ptrs,indirectSyms,nlist);
+       resolveImports(oc,image,symLC,nl_ptrs,indirectSyms,nlist);
     
     for(i=0;i<segLC->nsects;i++)
     {