X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FLinker.c;h=61b003469b52d78114f800952900ec692b48d2a1;hb=2cc392e73116d4cdf54b99511e3d1fa8b8e76586;hp=5f65e47396dfc89c385709874c87f3faf5cd95c8;hpb=b4a006b85f12fd8ff79a785d3fcd50fdcae73d1c;p=ghc-hetmet.git diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c index 5f65e47..61b0034 100644 --- a/ghc/rts/Linker.c +++ b/ghc/rts/Linker.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Linker.c,v 1.119 2003/04/29 21:37:31 wolfgang Exp $ + * $Id: Linker.c,v 1.126 2003/08/18 09:27:54 dons Exp $ * * (c) The GHC Team, 2000-2003 * @@ -59,7 +59,7 @@ #include #endif -#if defined(linux_TARGET_OS) || defined(solaris2_TARGET_OS) || defined(freebsd_TARGET_OS) || defined(netbsd_TARGET_OS) +#if defined(linux_TARGET_OS) || defined(solaris2_TARGET_OS) || defined(freebsd_TARGET_OS) || defined(netbsd_TARGET_OS) || defined(openbsd_TARGET_OS) # define OBJFORMAT_ELF #elif defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS) # define OBJFORMAT_PEi386 @@ -214,6 +214,15 @@ typedef struct _RtsSymbolVal { #define RTS_POSIX_ONLY_SYMBOLS /**/ #define RTS_CYGWIN_ONLY_SYMBOLS /**/ +/* Extra syms gen'ed by mingw-2's gcc-3.2: */ +#if __GNUC__>=3 +#define RTS_MINGW_EXTRA_SYMS \ + Sym(_imp____mb_cur_max) \ + Sym(_imp___pctype) +#else +#define RTS_MINGW_EXTRA_SYMS +#endif + /* These are statically linked from the mingw libraries into the ghc executable, so we have to employ this hack. */ #define RTS_MINGW_ONLY_SYMBOLS \ @@ -278,6 +287,7 @@ typedef struct _RtsSymbolVal { Sym(opendir) \ Sym(readdir) \ Sym(rewinddir) \ + RTS_MINGW_EXTRA_SYMS \ Sym(closedir) #endif @@ -401,6 +411,7 @@ typedef struct _RtsSymbolVal { SymX(quotIntegerzh_fast) \ SymX(quotRemIntegerzh_fast) \ SymX(raisezh_fast) \ + SymX(raiseIOzh_fast) \ SymX(remIntegerzh_fast) \ SymX(resetNonBlockingFd) \ SymX(resumeThread) \ @@ -450,6 +461,8 @@ typedef struct _RtsSymbolVal { SymX(stable_ptr_table) \ SymX(stackOverflow) \ SymX(stg_CAF_BLACKHOLE_info) \ + SymX(stg_BLACKHOLE_BQ_info) \ + SymX(awakenBlockedQueue) \ SymX(stg_CHARLIKE_closure) \ SymX(stg_EMPTY_MVAR_info) \ SymX(stg_IND_STATIC_info) \ @@ -543,18 +556,18 @@ typedef struct _RtsSymbolVal { Sym(__ashrdi3) \ Sym(__lshrdi3) \ Sym(__eprintf) +#elif defined(ia64_TARGET_ARCH) +#define RTS_LIBGCC_SYMBOLS \ + Sym(__divdi3) \ + Sym(__udivdi3) \ + Sym(__moddi3) \ + Sym(__umoddi3) \ + Sym(__divsf3) \ + Sym(__divdf3) #else #define RTS_LIBGCC_SYMBOLS #endif -#ifdef ia64_TARGET_ARCH -/* force these symbols to be present */ -#define RTS_EXTRA_SYMBOLS \ - Sym(__divsf3) -#else -#define RTS_EXTRA_SYMBOLS /* nothing */ -#endif - #ifdef darwin_TARGET_OS // Symbols that don't have a leading underscore // on Mac OS X. They have to receive special treatment, @@ -565,12 +578,11 @@ typedef struct _RtsSymbolVal { #endif /* entirely bogus claims about types of these symbols */ -#define Sym(vvv) extern void (vvv); +#define Sym(vvv) extern void vvv(void); #define SymX(vvv) /**/ #define SymX_redirect(vvv,xxx) /**/ RTS_SYMBOLS RTS_LONG_LONG_SYMS -RTS_EXTRA_SYMBOLS RTS_POSIX_ONLY_SYMBOLS RTS_MINGW_ONLY_SYMBOLS RTS_CYGWIN_ONLY_SYMBOLS @@ -598,7 +610,6 @@ RTS_LIBGCC_SYMBOLS static RtsSymbolVal rtsSyms[] = { RTS_SYMBOLS RTS_LONG_LONG_SYMS - RTS_EXTRA_SYMBOLS RTS_POSIX_ONLY_SYMBOLS RTS_MINGW_ONLY_SYMBOLS RTS_CYGWIN_ONLY_SYMBOLS @@ -724,7 +735,11 @@ addDLL( char *dll_name ) initLinker(); +#if !defined(openbsd_TARGET_OS) hdl= dlopen(dll_name, RTLD_NOW | RTLD_GLOBAL); +#else + hdl= dlopen(dll_name, RTLD_LAZY); +#endif if (hdl == NULL) { /* dlopen failed; return a ptr to the error msg. */ errmsg = dlerror(); @@ -2001,7 +2016,15 @@ ocResolve_PEi386 ( ObjectCode* oc ) # define ELF_NEED_PLT /* needs Procedure Linkage Tables */ #endif +#if !defined(openbsd_TARGET_OS) #include +#else +/* openbsd elf has things in different places, with diff names */ +#include +#include +#define R_386_32 RELOC_32 +#define R_386_PC32 RELOC_PC32 +#endif /* * Define a set of types which can be used for both ELF32 and ELF64 @@ -2033,11 +2056,19 @@ ocResolve_PEi386 ( ObjectCode* oc ) #define Elf_Sym Elf32_Sym #define Elf_Rel Elf32_Rel #define Elf_Rela Elf32_Rela +#ifndef ELF_ST_TYPE #define ELF_ST_TYPE ELF32_ST_TYPE +#endif +#ifndef ELF_ST_BIND #define ELF_ST_BIND ELF32_ST_BIND +#endif +#ifndef ELF_R_TYPE #define ELF_R_TYPE ELF32_R_TYPE +#endif +#ifndef ELF_R_SYM #define ELF_R_SYM ELF32_R_SYM #endif +#endif /* @@ -2698,8 +2729,8 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC, #ifdef ELF_FUNCTION_DESC /* If a function, already a function descriptor - we would have to copy it to add an offset. */ - if (S && ELF_ST_TYPE(sym.st_info) == STT_FUNC) - assert(A == 0); + if (S && (ELF_ST_TYPE(sym.st_info) == STT_FUNC) && (A != 0)) + belch("%s: function %s with addend %p", oc->fileName, symbol, (void *)A); #endif } if (!S) { @@ -2758,6 +2789,9 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC, case R_IA64_FPTR64LSB: *pP = value; break; + case R_IA64_PCREL64LSB: + *pP = value - P; + break; case R_IA64_SEGREL64LSB: addr = findElfSegment(ehdrC, value); *pP = value - addr; @@ -2766,6 +2800,7 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC, ia64_reloc_gprel22(P, value); break; case R_IA64_LTOFF22: + case R_IA64_LTOFF22X: case R_IA64_LTOFF_FPTR22: addr = allocateGOTEntry(value); ia64_reloc_gprel22(P, addr); @@ -2773,6 +2808,10 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC, case R_IA64_PCREL21B: ia64_reloc_pcrel21(P, S, oc); break; + case R_IA64_LDXMOV: + /* This goes with R_IA64_LTOFF22X and points to the load to + * convert into a move. We don't implement relaxation. */ + break; # endif default: belch("%s: unhandled ELF relocation(RelA) type %d\n",