/* -----------------------------------------------------------------------------
- * $Id: Linker.c,v 1.96 2002/06/15 19:38:11 wolfgang Exp $
+ * $Id: Linker.c,v 1.102 2002/09/05 08:58:56 simonmar Exp $
*
* (c) The GHC Team, 2000, 2001
*
#include <sys/types.h>
#endif
+#include <stdlib.h>
+#include <string.h>
+
#ifdef HAVE_SYS_STAT_H
#include <sys/stat.h>
#endif
#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>
#endif
/* Hash table mapping symbol names to Symbol */
-/*Str*/HashTable *symhash;
+static /*Str*/HashTable *symhash;
#if defined(OBJFORMAT_ELF)
static int ocVerifyImage_ELF ( ObjectCode* oc );
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) \
Maybe_ForeignObj \
Maybe_Stable_Names \
Sym(StgReturn) \
- Sym(__stginit_GHCziPrim) \
Sym(init_stack) \
SymX(__stg_chk_0) \
SymX(__stg_chk_1) \
SymX(rts_evalIO) \
SymX(rts_evalLazyIO) \
SymX(rts_eval_) \
- SymX(rts_getAddr) \
SymX(rts_getBool) \
SymX(rts_getChar) \
SymX(rts_getDouble) \
SymX(rts_getThreadId) \
SymX(rts_getWord) \
SymX(rts_getWord32) \
- SymX(rts_mkAddr) \
SymX(rts_mkBool) \
SymX(rts_mkChar) \
SymX(rts_mkDouble) \
Sym(__umoddi3) \
Sym(__ashldi3) \
Sym(__ashrdi3) \
- Sym(__lshrdi3)
+ Sym(__lshrdi3) \
+ SymX(__eprintf)
#else
#define RTS_EXTRA_SYMBOLS /* nothing */
#endif
}
static void resolveImports(
+ ObjectCode* oc,
char *image,
struct symtab_command *symLC,
struct section *sect, // ptr to lazy or non-lazy symbol pointer section
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)
{
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;
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;
}
}
+ // 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++)
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;
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;
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++)
{