/* -----------------------------------------------------------------------------
- * $Id: Linker.c,v 1.95 2002/06/12 22:29:43 wolfgang Exp $
+ * $Id: Linker.c,v 1.97 2002/07/02 10:22:13 wolfgang Exp $
*
* (c) The GHC Team, 2000, 2001
*
Sym(__umoddi3)
#endif
-#ifdef darwin_TARGET_OS
-#define RTS_DARWIN_ONLY_SYMBOLS \
- Sym(__divdi3) \
- Sym(__udivdi3) \
- Sym(__moddi3) \
- Sym(__umoddi3) \
- Sym(__ashldi3) \
- Sym(__ashrdi3) \
- Sym(__lshrdi3) \
- SymX(stg_gc_enter_2) \
- SymX(stg_gc_enter_3) \
- SymX(stg_gc_enter_4) \
- SymX(stg_gc_enter_5) \
- SymX(stg_gc_enter_6) \
- SymX(stg_gc_enter_7) \
- SymX(stg_gc_enter_8) \
- SymX(stg_chk_2) \
- SymX(stg_chk_3) \
- SymX(stg_chk_4) \
- SymX(stg_chk_5) \
- SymX(stg_chk_6) \
- SymX(stg_chk_7) \
- SymX(stg_chk_8) \
-
-#else
-#define RTS_DARWIN_ONLY_SYMBOLS
-#endif
-
#ifndef SMP
# define MAIN_CAP_SYM SymX(MainCapability)
#else
/* force these symbols to be present */
#define RTS_EXTRA_SYMBOLS \
Sym(__divsf3)
+#elif defined(powerpc_TARGET_ARCH)
+#define RTS_EXTRA_SYMBOLS \
+ Sym(__divdi3) \
+ Sym(__udivdi3) \
+ Sym(__moddi3) \
+ Sym(__umoddi3) \
+ Sym(__ashldi3) \
+ Sym(__ashrdi3) \
+ Sym(__lshrdi3) \
+ SymX(__eprintf)
#else
#define RTS_EXTRA_SYMBOLS /* nothing */
#endif
RTS_POSIX_ONLY_SYMBOLS
RTS_MINGW_ONLY_SYMBOLS
RTS_CYGWIN_ONLY_SYMBOLS
-RTS_DARWIN_ONLY_SYMBOLS
#undef Sym
#undef SymX
RTS_POSIX_ONLY_SYMBOLS
RTS_MINGW_ONLY_SYMBOLS
RTS_CYGWIN_ONLY_SYMBOLS
- RTS_DARWIN_ONLY_SYMBOLS
{ 0, 0 } /* sentinel */
};
}
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++)
{