[project @ 2003-12-17 17:18:27 by sof]
[ghc-hetmet.git] / ghc / rts / Linker.c
index 73f69e2..85d5809 100644 (file)
@@ -1,5 +1,4 @@
 /* -----------------------------------------------------------------------------
- * $Id: Linker.c,v 1.138 2003/10/29 16:12:00 wolfgang Exp $
  *
  * (c) The GHC Team, 2000-2003
  *
@@ -230,6 +229,7 @@ typedef struct _RtsSymbolVal {
 #define RTS_MINGW_ONLY_SYMBOLS                  \
       SymX(asyncReadzh_fast)                   \
       SymX(asyncWritezh_fast)                  \
+      SymX(asyncDoProczh_fast)                 \
       SymX(memset)                              \
       SymX(inet_ntoa)                           \
       SymX(inet_addr)                           \
@@ -554,6 +554,13 @@ typedef struct _RtsSymbolVal {
 #define RTS_LONG_LONG_SYMS /* nothing */
 #endif
 
+#ifdef HAVE_TERMIOS_H
+#define RTS_TERMIOS_SYMS                        \
+      Sym(saved_termios)
+#else
+#define RTS_TERMIOS_SYMS /* nothing */
+#endif
+
 // 64-bit support functions in libgcc.a
 #if defined(__GNUC__) && SIZEOF_VOID_P <= 4
 #define RTS_LIBGCC_SYMBOLS                     \
@@ -595,6 +602,7 @@ RTS_LONG_LONG_SYMS
 RTS_POSIX_ONLY_SYMBOLS
 RTS_MINGW_ONLY_SYMBOLS
 RTS_CYGWIN_ONLY_SYMBOLS
+RTS_TERMIOS_SYMS
 RTS_LIBGCC_SYMBOLS
 #undef Sym
 #undef SymX
@@ -744,11 +752,8 @@ 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();
@@ -1913,11 +1918,16 @@ ocResolve_PEi386 ( ObjectCode* oc )
         * real count can be found in the first reloc entry.
          *
         * See Section 4.1 (last para) of the PE spec (rev6.0).
+        *
+        * Nov2003 update: the GNU linker still doesn't correctly 
+        * handle the generation of relocatable object files with 
+        * overflown relocations. Hence the output to warn of potential 
+        * troubles.
         */
         COFF_reloc* rel = (COFF_reloc*)
                            myindex ( sizeof_COFF_reloc, reltab, 0 );
        noRelocs = rel->VirtualAddress;
-       fprintf(stderr, "Overflown relocs: %u\n", noRelocs);
+       fprintf(stderr, "WARNING: Overflown relocation field (# relocs found: %u)\n", noRelocs); fflush(stderr);
        j = 1;
       } else {
        noRelocs = sectab_i->NumberOfRelocations;