X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FLinker.c;h=64a367b5cc78014f30272a16f593f421ac9e1c8c;hb=1c169ab6d2d90c8a84abbbdf493021e562a13229;hp=5f65e47396dfc89c385709874c87f3faf5cd95c8;hpb=b4a006b85f12fd8ff79a785d3fcd50fdcae73d1c;p=ghc-hetmet.git diff --git a/ghc/rts/Linker.c b/ghc/rts/Linker.c index 5f65e47..64a367b 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.124 2003/06/26 20:58:33 panne Exp $ * * (c) The GHC Team, 2000-2003 * @@ -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) \ @@ -543,18 +554,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 +576,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 +608,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 @@ -2033,11 +2042,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 +2715,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 +2775,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 +2786,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 +2794,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",