[project @ 2005-04-29 21:52:38 by sof]
[ghc-hetmet.git] / ghc / rts / Linker.c
index 2f23c45..5d887f4 100644 (file)
@@ -296,7 +296,8 @@ typedef struct _RtsSymbolVal {
       SymX(log)                                 \
       SymX(sqrt)                                \
       SymX(memcpy)                              \
-      SymX(stg_InstallConsoleEvent)             \
+      SymX(rts_InstallConsoleEvent)             \
+      SymX(rts_ConsoleHandlerDone)              \
       Sym(mktime)                               \
       Sym(_imp___timezone)                      \
       Sym(_imp___tzname)                        \
@@ -317,6 +318,14 @@ typedef struct _RtsSymbolVal {
 # define MAIN_CAP_SYM
 #endif
 
+#if !defined(mingw32_HOST_OS)
+#define RTS_USER_SIGNALS_SYMBOLS \
+   SymX(startSignalHandler) \
+   SymX(setIOManagerPipe)
+#else
+#define RTS_USER_SIGNALS_SYMBOLS /* nothing */
+#endif
+
 #ifdef TABLES_NEXT_TO_CODE
 #define RTS_RET_SYMBOLS /* nothing */
 #else
@@ -590,7 +599,8 @@ typedef struct _RtsSymbolVal {
       SymX(word2Integerzh_fast)                        \
       SymX(writeTVarzh_fast)                   \
       SymX(xorIntegerzh_fast)                  \
-      SymX(yieldzh_fast)
+      SymX(yieldzh_fast)                        \
+      RTS_USER_SIGNALS_SYMBOLS
 
 #ifdef SUPPORT_LONG_LONGS
 #define RTS_LONG_LONG_SYMS                     \
@@ -803,24 +813,6 @@ addDLL( char *dll_name )
    void *hdl;
    char *errmsg;
 
-   // *** HACK
-   // If we load libHSbase_cbits_dyn.[so|dylib],
-   // then we know that we need to activate another newCAF
-   // related hack in Storage.c because we can't redirect
-   // newCAF to newDynCAF with the system dynamic linker.
-#ifdef OBJFORMAT_MACHO
-   const char *hsbase = "/libHSbase_cbits_dyn.dylib";
-#else
-   const char *hsbase = "/libHSbase_cbits_dyn.so";
-#endif
-   int namelen = strlen(dll_name);
-   int baselen = strlen(hsbase);
-   if(namelen > baselen && !strcmp(dll_name + namelen - baselen, hsbase))
-   {
-      keepCAFs = rtsTrue;
-   }
-   // *** END HACK.
-
    initLinker();
 
    hdl= dlopen(dll_name, RTLD_NOW | RTLD_GLOBAL);
@@ -1971,6 +1963,7 @@ ocGetNames_PEi386 ( ObjectCode* oc )
 #     endif
 
       if (0==strcmp(".text",sectab_i->Name) ||
+          0==strcmp(".rdata",sectab_i->Name)||
           0==strcmp(".rodata",sectab_i->Name))
          kind = SECTIONKIND_CODE_OR_RODATA;
       if (0==strcmp(".data",sectab_i->Name) ||
@@ -1990,7 +1983,7 @@ ocGetNames_PEi386 ( ObjectCode* oc )
           && 0 != strcmp(".stab", sectab_i->Name)
           && 0 != strcmp(".stabstr", sectab_i->Name)
          ) {
-         errorBelch("Unknown PEi386 section name `%s'", sectab_i->Name);
+         errorBelch("Unknown PEi386 section name `%s' (while processing: %s)", sectab_i->Name, oc->fileName);
          return 0;
       }
 
@@ -3137,6 +3130,7 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
             break;
 #        endif
 
+#if x86_64_HOST_OS
       case R_X86_64_64:
          *(Elf64_Xword *)P = value;
          break;
@@ -3152,6 +3146,7 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
       case R_X86_64_32S:
          *(Elf64_Sword *)P = (Elf64_Sword)value;
          break;
+#endif
 
          default:
             errorBelch("%s: unhandled ELF relocation(RelA) type %d\n",
@@ -3941,7 +3936,7 @@ static void machoInitSymbolsWithoutUnderscore()
 {
     extern void* symbolsWithoutUnderscore[];
     void **p = symbolsWithoutUnderscore;
-    __asm__ volatile(".data\n_symbolsWithoutUnderscore:");
+    __asm__ volatile(".globl _symbolsWithoutUnderscore\n.data\n_symbolsWithoutUnderscore:");
 
 #undef Sym
 #define Sym(x)  \