SymX(log) \
SymX(sqrt) \
SymX(memcpy) \
- SymX(stg_InstallConsoleEvent) \
+ SymX(rts_InstallConsoleEvent) \
+ SymX(rts_ConsoleHandlerDone) \
Sym(mktime) \
Sym(_imp___timezone) \
Sym(_imp___tzname) \
Sym(_imp___iob) \
+ Sym(_imp___osver) \
Sym(localtime) \
Sym(gmtime) \
Sym(opendir) \
# 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
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(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 \
# if defined(openbsd_HOST_OS)
dl_libc_handle = dlopen("libc.so", RTLD_LAZY);
# endif
-# endif // RTLD_DEFAULT
+# endif /* RTLD_DEFAULT */
# endif
}
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);
#endif
n = ROUND_UP(oc->fileSize, pagesize);
- oc->image = mmap(map_addr, n, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
+
+ /* Link objects into the lower 2Gb on x86_64. GHC assumes the
+ * small memory model on this architecture (see gcc docs,
+ * -mcmodel=small).
+ */
+#ifdef x86_64_HOST_ARCH
+#define EXTRA_MAP_FLAGS MAP_32BIT
+#else
+#define EXTRA_MAP_FLAGS 0
+#endif
+
+ oc->image = mmap(map_addr, n, PROT_EXEC|PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|EXTRA_MAP_FLAGS, fd, 0);
if (oc->image == MAP_FAILED)
barf("loadObj: can't map `%s'", path);
# 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) ||
&& 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;
}
/* Newline first because the interactive linker has printed "linking..." */
errorBelch("\n%s: unknown symbol `%s'", oc->fileName, symbol);
return 0;
- foundit:
+ foundit:;
}
checkProddableBlock(oc, pP);
switch (reltab_j->Type) {
case EM_IA_64: IF_DEBUG(linker,debugBelch( "ia64" )); break;
#endif
case EM_PPC: IF_DEBUG(linker,debugBelch( "powerpc32" )); break;
+#ifdef EM_X86_64
+ case EM_X86_64: IF_DEBUG(linker,debugBelch( "x86_64" )); break;
+#endif
default: IF_DEBUG(linker,debugBelch( "unknown" ));
errorBelch("%s: unknown architecture", oc->fileName);
return 0;
target_shndx, symtab_shndx ));
for (j = 0; j < nent; j++) {
-#if defined(DEBUG) || defined(sparc_HOST_ARCH) || defined(ia64_HOST_ARCH) || defined(powerpc_HOST_ARCH)
+#if defined(DEBUG) || defined(sparc_HOST_ARCH) || defined(ia64_HOST_ARCH) || defined(powerpc_HOST_ARCH) || defined(x86_64_HOST_ARCH)
/* This #ifdef only serves to avoid unused-var warnings. */
Elf_Addr offset = rtab[j].r_offset;
Elf_Addr P = targ + offset;
| (delta & 0x3fffffc);
break;
# endif
+
+#if x86_64_HOST_OS
+ case R_X86_64_64:
+ *(Elf64_Xword *)P = value;
+ break;
+
+ case R_X86_64_PC32:
+ *(Elf64_Word *)P = (Elf64_Word) (value - P);
+ break;
+
+ case R_X86_64_32:
+ *(Elf64_Word *)P = (Elf64_Word)value;
+ break;
+
+ case R_X86_64_32S:
+ *(Elf64_Sword *)P = (Elf64_Sword)value;
+ break;
+#endif
+
default:
errorBelch("%s: unhandled ELF relocation(RelA) type %d\n",
oc->fileName, ELF_R_TYPE(info));
{
extern void* symbolsWithoutUnderscore[];
void **p = symbolsWithoutUnderscore;
- __asm__ volatile(".data\n_symbolsWithoutUnderscore:");
+ __asm__ volatile(".globl _symbolsWithoutUnderscore\n.data\n_symbolsWithoutUnderscore:");
#undef Sym
#define Sym(x) \