1 /* -----------------------------------------------------------------------------
3 * (c) The GHC Team, 2000-2004
7 * ---------------------------------------------------------------------------*/
10 #include "PosixSource.h"
13 /* Linux needs _GNU_SOURCE to get RTLD_DEFAULT from <dlfcn.h> and
14 MREMAP_MAYMOVE from <sys/mman.h>.
25 #include "LinkerInternals.h"
29 #include "RtsTypeable.h"
31 #ifdef HAVE_SYS_TYPES_H
32 #include <sys/types.h>
38 #ifdef HAVE_SYS_STAT_H
42 #if defined(HAVE_DLFCN_H)
46 #if defined(cygwin32_HOST_OS)
51 #ifdef HAVE_SYS_TIME_H
55 #include <sys/fcntl.h>
56 #include <sys/termios.h>
57 #include <sys/utime.h>
58 #include <sys/utsname.h>
62 #if defined(ia64_HOST_ARCH) || defined(openbsd_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS)
67 #if defined(openbsd_HOST_OS) || defined(linux_HOST_OS) || defined(freebsd_HOST_OS)
75 #if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) || defined(freebsd_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS)
76 # define OBJFORMAT_ELF
77 #elif defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS)
78 # define OBJFORMAT_PEi386
81 #elif defined(darwin_HOST_OS)
82 # define OBJFORMAT_MACHO
83 # include <mach-o/loader.h>
84 # include <mach-o/nlist.h>
85 # include <mach-o/reloc.h>
86 # include <mach-o/dyld.h>
87 #if defined(powerpc_HOST_ARCH)
88 # include <mach-o/ppc/reloc.h>
92 /* Hash table mapping symbol names to Symbol */
93 static /*Str*/HashTable *symhash;
95 /* Hash table mapping symbol names to StgStablePtr */
96 static /*Str*/HashTable *stablehash;
98 /* List of currently loaded objects */
99 ObjectCode *objects = NULL; /* initially empty */
101 #if defined(OBJFORMAT_ELF)
102 static int ocVerifyImage_ELF ( ObjectCode* oc );
103 static int ocGetNames_ELF ( ObjectCode* oc );
104 static int ocResolve_ELF ( ObjectCode* oc );
105 #if defined(powerpc_HOST_ARCH)
106 static int ocAllocateJumpIslands_ELF ( ObjectCode* oc );
108 #elif defined(OBJFORMAT_PEi386)
109 static int ocVerifyImage_PEi386 ( ObjectCode* oc );
110 static int ocGetNames_PEi386 ( ObjectCode* oc );
111 static int ocResolve_PEi386 ( ObjectCode* oc );
112 #elif defined(OBJFORMAT_MACHO)
113 static int ocVerifyImage_MachO ( ObjectCode* oc );
114 static int ocGetNames_MachO ( ObjectCode* oc );
115 static int ocResolve_MachO ( ObjectCode* oc );
117 static int machoGetMisalignment( FILE * );
118 #ifdef powerpc_HOST_ARCH
119 static int ocAllocateJumpIslands_MachO ( ObjectCode* oc );
120 static void machoInitSymbolsWithoutUnderscore( void );
124 #if defined(x86_64_HOST_ARCH)
125 static void*x86_64_high_symbol( char *lbl, void *addr );
128 /* -----------------------------------------------------------------------------
129 * Built-in symbols from the RTS
132 typedef struct _RtsSymbolVal {
139 #define Maybe_Stable_Names SymX(mkWeakzh_fast) \
140 SymX(makeStableNamezh_fast) \
141 SymX(finalizzeWeakzh_fast)
143 /* These are not available in GUM!!! -- HWL */
144 #define Maybe_Stable_Names
147 #if !defined (mingw32_HOST_OS)
148 #define RTS_POSIX_ONLY_SYMBOLS \
149 SymX(signal_handlers) \
150 SymX(stg_sig_install) \
154 #if defined (cygwin32_HOST_OS)
155 #define RTS_MINGW_ONLY_SYMBOLS /**/
156 /* Don't have the ability to read import libs / archives, so
157 * we have to stupidly list a lot of what libcygwin.a
160 #define RTS_CYGWIN_ONLY_SYMBOLS \
238 #elif !defined(mingw32_HOST_OS)
239 #define RTS_MINGW_ONLY_SYMBOLS /**/
240 #define RTS_CYGWIN_ONLY_SYMBOLS /**/
241 #else /* defined(mingw32_HOST_OS) */
242 #define RTS_POSIX_ONLY_SYMBOLS /**/
243 #define RTS_CYGWIN_ONLY_SYMBOLS /**/
245 /* Extra syms gen'ed by mingw-2's gcc-3.2: */
247 #define RTS_MINGW_EXTRA_SYMS \
248 Sym(_imp____mb_cur_max) \
251 #define RTS_MINGW_EXTRA_SYMS
254 /* These are statically linked from the mingw libraries into the ghc
255 executable, so we have to employ this hack. */
256 #define RTS_MINGW_ONLY_SYMBOLS \
257 SymX(asyncReadzh_fast) \
258 SymX(asyncWritezh_fast) \
259 SymX(asyncDoProczh_fast) \
271 SymX(getservbyname) \
272 SymX(getservbyport) \
273 SymX(getprotobynumber) \
274 SymX(getprotobyname) \
275 SymX(gethostbyname) \
276 SymX(gethostbyaddr) \
323 SymX(rts_InstallConsoleEvent) \
324 SymX(rts_ConsoleHandlerDone) \
326 Sym(_imp___timezone) \
336 RTS_MINGW_EXTRA_SYMS \
340 #if defined(darwin_TARGET_OS) && HAVE_PRINTF_LDBLSTUB
341 #define RTS_DARWIN_ONLY_SYMBOLS \
342 Sym(asprintf$LDBLStub) \
346 Sym(fprintf$LDBLStub) \
347 Sym(fscanf$LDBLStub) \
348 Sym(fwprintf$LDBLStub) \
349 Sym(fwscanf$LDBLStub) \
350 Sym(printf$LDBLStub) \
351 Sym(scanf$LDBLStub) \
352 Sym(snprintf$LDBLStub) \
353 Sym(sprintf$LDBLStub) \
354 Sym(sscanf$LDBLStub) \
355 Sym(strtold$LDBLStub) \
356 Sym(swprintf$LDBLStub) \
357 Sym(swscanf$LDBLStub) \
358 Sym(syslog$LDBLStub) \
359 Sym(vasprintf$LDBLStub) \
361 Sym(verrc$LDBLStub) \
362 Sym(verrx$LDBLStub) \
363 Sym(vfprintf$LDBLStub) \
364 Sym(vfscanf$LDBLStub) \
365 Sym(vfwprintf$LDBLStub) \
366 Sym(vfwscanf$LDBLStub) \
367 Sym(vprintf$LDBLStub) \
368 Sym(vscanf$LDBLStub) \
369 Sym(vsnprintf$LDBLStub) \
370 Sym(vsprintf$LDBLStub) \
371 Sym(vsscanf$LDBLStub) \
372 Sym(vswprintf$LDBLStub) \
373 Sym(vswscanf$LDBLStub) \
374 Sym(vsyslog$LDBLStub) \
375 Sym(vwarn$LDBLStub) \
376 Sym(vwarnc$LDBLStub) \
377 Sym(vwarnx$LDBLStub) \
378 Sym(vwprintf$LDBLStub) \
379 Sym(vwscanf$LDBLStub) \
381 Sym(warnc$LDBLStub) \
382 Sym(warnx$LDBLStub) \
383 Sym(wcstold$LDBLStub) \
384 Sym(wprintf$LDBLStub) \
387 #define RTS_DARWIN_ONLY_SYMBOLS
391 # define MAIN_CAP_SYM SymX(MainCapability)
393 # define MAIN_CAP_SYM
396 #if !defined(mingw32_HOST_OS)
397 #define RTS_USER_SIGNALS_SYMBOLS \
398 SymX(setIOManagerPipe)
400 #define RTS_USER_SIGNALS_SYMBOLS \
401 SymX(sendIOManagerEvent) \
402 SymX(readIOManagerEvent) \
403 SymX(getIOManagerEvent) \
404 SymX(console_handler)
407 #ifdef TABLES_NEXT_TO_CODE
408 #define RTS_RET_SYMBOLS /* nothing */
410 #define RTS_RET_SYMBOLS \
411 SymX(stg_enter_ret) \
412 SymX(stg_gc_fun_ret) \
419 SymX(stg_ap_pv_ret) \
420 SymX(stg_ap_pp_ret) \
421 SymX(stg_ap_ppv_ret) \
422 SymX(stg_ap_ppp_ret) \
423 SymX(stg_ap_pppv_ret) \
424 SymX(stg_ap_pppp_ret) \
425 SymX(stg_ap_ppppp_ret) \
426 SymX(stg_ap_pppppp_ret)
429 #define RTS_SYMBOLS \
432 SymX(stg_enter_info) \
433 SymX(stg_gc_void_info) \
434 SymX(__stg_gc_enter_1) \
435 SymX(stg_gc_noregs) \
436 SymX(stg_gc_unpt_r1_info) \
437 SymX(stg_gc_unpt_r1) \
438 SymX(stg_gc_unbx_r1_info) \
439 SymX(stg_gc_unbx_r1) \
440 SymX(stg_gc_f1_info) \
442 SymX(stg_gc_d1_info) \
444 SymX(stg_gc_l1_info) \
447 SymX(stg_gc_fun_info) \
449 SymX(stg_gc_gen_info) \
450 SymX(stg_gc_gen_hp) \
452 SymX(stg_gen_yield) \
453 SymX(stg_yield_noregs) \
454 SymX(stg_yield_to_interpreter) \
455 SymX(stg_gen_block) \
456 SymX(stg_block_noregs) \
458 SymX(stg_block_takemvar) \
459 SymX(stg_block_putmvar) \
460 SymX(stg_seq_frame_info) \
462 SymX(MallocFailHook) \
464 SymX(OutOfHeapHook) \
465 SymX(StackOverflowHook) \
466 SymX(__encodeDouble) \
467 SymX(__encodeFloat) \
471 SymX(__gmpz_cmp_si) \
472 SymX(__gmpz_cmp_ui) \
473 SymX(__gmpz_get_si) \
474 SymX(__gmpz_get_ui) \
475 SymX(__int_encodeDouble) \
476 SymX(__int_encodeFloat) \
477 SymX(andIntegerzh_fast) \
478 SymX(atomicallyzh_fast) \
482 SymX(blockAsyncExceptionszh_fast) \
484 SymX(catchRetryzh_fast) \
485 SymX(catchSTMzh_fast) \
487 SymX(closure_flags) \
489 SymX(cmpIntegerzh_fast) \
490 SymX(cmpIntegerIntzh_fast) \
491 SymX(complementIntegerzh_fast) \
492 SymX(createAdjustor) \
493 SymX(decodeDoublezh_fast) \
494 SymX(decodeFloatzh_fast) \
497 SymX(deRefWeakzh_fast) \
498 SymX(deRefStablePtrzh_fast) \
499 SymX(dirty_MUT_VAR) \
500 SymX(divExactIntegerzh_fast) \
501 SymX(divModIntegerzh_fast) \
503 SymX(forkOnzh_fast) \
505 SymX(forkOS_createThread) \
506 SymX(freeHaskellFunctionPtr) \
507 SymX(freeStablePtr) \
508 SymX(getOrSetTypeableStore) \
509 SymX(gcdIntegerzh_fast) \
510 SymX(gcdIntegerIntzh_fast) \
511 SymX(gcdIntzh_fast) \
520 SymX(hs_perform_gc) \
521 SymX(hs_free_stable_ptr) \
522 SymX(hs_free_fun_ptr) \
524 SymX(infoPtrzh_fast) \
525 SymX(closurePayloadzh_fast) \
526 SymX(int2Integerzh_fast) \
527 SymX(integer2Intzh_fast) \
528 SymX(integer2Wordzh_fast) \
529 SymX(isCurrentThreadBoundzh_fast) \
530 SymX(isDoubleDenormalized) \
531 SymX(isDoubleInfinite) \
533 SymX(isDoubleNegativeZero) \
534 SymX(isEmptyMVarzh_fast) \
535 SymX(isFloatDenormalized) \
536 SymX(isFloatInfinite) \
538 SymX(isFloatNegativeZero) \
539 SymX(killThreadzh_fast) \
541 SymX(insertStableSymbol) \
544 SymX(makeStablePtrzh_fast) \
545 SymX(minusIntegerzh_fast) \
546 SymX(mkApUpd0zh_fast) \
547 SymX(myThreadIdzh_fast) \
548 SymX(labelThreadzh_fast) \
549 SymX(newArrayzh_fast) \
550 SymX(newBCOzh_fast) \
551 SymX(newByteArrayzh_fast) \
552 SymX_redirect(newCAF, newDynCAF) \
553 SymX(newMVarzh_fast) \
554 SymX(newMutVarzh_fast) \
555 SymX(newTVarzh_fast) \
556 SymX(atomicModifyMutVarzh_fast) \
557 SymX(newPinnedByteArrayzh_fast) \
559 SymX(orIntegerzh_fast) \
561 SymX(performMajorGC) \
562 SymX(plusIntegerzh_fast) \
565 SymX(putMVarzh_fast) \
566 SymX(quotIntegerzh_fast) \
567 SymX(quotRemIntegerzh_fast) \
569 SymX(raiseIOzh_fast) \
570 SymX(readTVarzh_fast) \
571 SymX(remIntegerzh_fast) \
572 SymX(resetNonBlockingFd) \
577 SymX(rts_checkSchedStatus) \
580 SymX(rts_evalLazyIO) \
581 SymX(rts_evalStableIO) \
585 SymX(rts_getDouble) \
590 SymX(rts_getFunPtr) \
591 SymX(rts_getStablePtr) \
592 SymX(rts_getThreadId) \
594 SymX(rts_getWord32) \
607 SymX(rts_mkStablePtr) \
615 SymX(rtsSupportsBoundThreads) \
616 SymX(__hscore_get_saved_termios) \
617 SymX(__hscore_set_saved_termios) \
619 SymX(startupHaskell) \
620 SymX(shutdownHaskell) \
621 SymX(shutdownHaskellAndExit) \
622 SymX(stable_ptr_table) \
623 SymX(stackOverflow) \
624 SymX(stg_CAF_BLACKHOLE_info) \
625 SymX(awakenBlockedQueue) \
626 SymX(stg_CHARLIKE_closure) \
627 SymX(stg_EMPTY_MVAR_info) \
628 SymX(stg_IND_STATIC_info) \
629 SymX(stg_INTLIKE_closure) \
630 SymX(stg_MUT_ARR_PTRS_DIRTY_info) \
631 SymX(stg_MUT_ARR_PTRS_FROZEN_info) \
632 SymX(stg_MUT_ARR_PTRS_FROZEN0_info) \
633 SymX(stg_WEAK_info) \
634 SymX(stg_ap_v_info) \
635 SymX(stg_ap_f_info) \
636 SymX(stg_ap_d_info) \
637 SymX(stg_ap_l_info) \
638 SymX(stg_ap_n_info) \
639 SymX(stg_ap_p_info) \
640 SymX(stg_ap_pv_info) \
641 SymX(stg_ap_pp_info) \
642 SymX(stg_ap_ppv_info) \
643 SymX(stg_ap_ppp_info) \
644 SymX(stg_ap_pppv_info) \
645 SymX(stg_ap_pppp_info) \
646 SymX(stg_ap_ppppp_info) \
647 SymX(stg_ap_pppppp_info) \
648 SymX(stg_ap_0_fast) \
649 SymX(stg_ap_v_fast) \
650 SymX(stg_ap_f_fast) \
651 SymX(stg_ap_d_fast) \
652 SymX(stg_ap_l_fast) \
653 SymX(stg_ap_n_fast) \
654 SymX(stg_ap_p_fast) \
655 SymX(stg_ap_pv_fast) \
656 SymX(stg_ap_pp_fast) \
657 SymX(stg_ap_ppv_fast) \
658 SymX(stg_ap_ppp_fast) \
659 SymX(stg_ap_pppv_fast) \
660 SymX(stg_ap_pppp_fast) \
661 SymX(stg_ap_ppppp_fast) \
662 SymX(stg_ap_pppppp_fast) \
663 SymX(stg_ap_1_upd_info) \
664 SymX(stg_ap_2_upd_info) \
665 SymX(stg_ap_3_upd_info) \
666 SymX(stg_ap_4_upd_info) \
667 SymX(stg_ap_5_upd_info) \
668 SymX(stg_ap_6_upd_info) \
669 SymX(stg_ap_7_upd_info) \
671 SymX(stg_sel_0_upd_info) \
672 SymX(stg_sel_10_upd_info) \
673 SymX(stg_sel_11_upd_info) \
674 SymX(stg_sel_12_upd_info) \
675 SymX(stg_sel_13_upd_info) \
676 SymX(stg_sel_14_upd_info) \
677 SymX(stg_sel_15_upd_info) \
678 SymX(stg_sel_1_upd_info) \
679 SymX(stg_sel_2_upd_info) \
680 SymX(stg_sel_3_upd_info) \
681 SymX(stg_sel_4_upd_info) \
682 SymX(stg_sel_5_upd_info) \
683 SymX(stg_sel_6_upd_info) \
684 SymX(stg_sel_7_upd_info) \
685 SymX(stg_sel_8_upd_info) \
686 SymX(stg_sel_9_upd_info) \
687 SymX(stg_upd_frame_info) \
688 SymX(suspendThread) \
689 SymX(takeMVarzh_fast) \
690 SymX(timesIntegerzh_fast) \
691 SymX(tryPutMVarzh_fast) \
692 SymX(tryTakeMVarzh_fast) \
693 SymX(unblockAsyncExceptionszh_fast) \
695 SymX(unsafeThawArrayzh_fast) \
696 SymX(waitReadzh_fast) \
697 SymX(waitWritezh_fast) \
698 SymX(word2Integerzh_fast) \
699 SymX(writeTVarzh_fast) \
700 SymX(xorIntegerzh_fast) \
702 SymX(stg_interp_constr_entry) \
703 SymX(stg_interp_constr1_entry) \
704 SymX(stg_interp_constr2_entry) \
705 SymX(stg_interp_constr3_entry) \
706 SymX(stg_interp_constr4_entry) \
707 SymX(stg_interp_constr5_entry) \
708 SymX(stg_interp_constr6_entry) \
709 SymX(stg_interp_constr7_entry) \
710 SymX(stg_interp_constr8_entry) \
713 SymX(getAllocations) \
716 RTS_USER_SIGNALS_SYMBOLS
718 #ifdef SUPPORT_LONG_LONGS
719 #define RTS_LONG_LONG_SYMS \
720 SymX(int64ToIntegerzh_fast) \
721 SymX(word64ToIntegerzh_fast)
723 #define RTS_LONG_LONG_SYMS /* nothing */
726 // 64-bit support functions in libgcc.a
727 #if defined(__GNUC__) && SIZEOF_VOID_P <= 4
728 #define RTS_LIBGCC_SYMBOLS \
738 #elif defined(ia64_HOST_ARCH)
739 #define RTS_LIBGCC_SYMBOLS \
747 #define RTS_LIBGCC_SYMBOLS
750 #if defined(darwin_HOST_OS) && defined(powerpc_HOST_ARCH)
751 // Symbols that don't have a leading underscore
752 // on Mac OS X. They have to receive special treatment,
753 // see machoInitSymbolsWithoutUnderscore()
754 #define RTS_MACHO_NOUNDERLINE_SYMBOLS \
759 /* entirely bogus claims about types of these symbols */
760 #define Sym(vvv) extern void vvv(void);
761 #define SymX(vvv) /**/
762 #define SymX_redirect(vvv,xxx) /**/
766 RTS_POSIX_ONLY_SYMBOLS
767 RTS_MINGW_ONLY_SYMBOLS
768 RTS_CYGWIN_ONLY_SYMBOLS
769 RTS_DARWIN_ONLY_SYMBOLS
775 #ifdef LEADING_UNDERSCORE
776 #define MAYBE_LEADING_UNDERSCORE_STR(s) ("_" s)
778 #define MAYBE_LEADING_UNDERSCORE_STR(s) (s)
781 #define Sym(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
783 #define SymX(vvv) Sym(vvv)
785 // SymX_redirect allows us to redirect references to one symbol to
786 // another symbol. See newCAF/newDynCAF for an example.
787 #define SymX_redirect(vvv,xxx) \
788 { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
791 static RtsSymbolVal rtsSyms[] = {
795 RTS_POSIX_ONLY_SYMBOLS
796 RTS_MINGW_ONLY_SYMBOLS
797 RTS_CYGWIN_ONLY_SYMBOLS
798 RTS_DARWIN_ONLY_SYMBOLS
800 #if defined(darwin_HOST_OS) && defined(i386_HOST_ARCH)
801 // dyld stub code contains references to this,
802 // but it should never be called because we treat
803 // lazy pointers as nonlazy.
804 { "dyld_stub_binding_helper", (void*)0xDEADBEEF },
806 { 0, 0 } /* sentinel */
811 /* -----------------------------------------------------------------------------
812 * Insert symbols into hash tables, checking for duplicates.
815 static void ghciInsertStrHashTable ( char* obj_name,
821 if (lookupHashTable(table, (StgWord)key) == NULL)
823 insertStrHashTable(table, (StgWord)key, data);
828 "GHCi runtime linker: fatal error: I found a duplicate definition for symbol\n"
830 "whilst processing object file\n"
832 "This could be caused by:\n"
833 " * Loading two different object files which export the same symbol\n"
834 " * Specifying the same object file twice on the GHCi command line\n"
835 " * An incorrect `package.conf' entry, causing some object to be\n"
837 "GHCi cannot safely continue in this situation. Exiting now. Sorry.\n"
844 /* -----------------------------------------------------------------------------
845 * initialize the object linker
849 static int linker_init_done = 0 ;
851 #if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
852 static void *dl_prog_handle;
860 /* Make initLinker idempotent, so we can call it
861 before evey relevant operation; that means we
862 don't need to initialise the linker separately */
863 if (linker_init_done == 1) { return; } else {
864 linker_init_done = 1;
867 stablehash = allocStrHashTable();
868 symhash = allocStrHashTable();
870 /* populate the symbol table with stuff from the RTS */
871 for (sym = rtsSyms; sym->lbl != NULL; sym++) {
872 ghciInsertStrHashTable("(GHCi built-in symbols)",
873 symhash, sym->lbl, sym->addr);
875 # if defined(OBJFORMAT_MACHO) && defined(powerpc_HOST_ARCH)
876 machoInitSymbolsWithoutUnderscore();
879 # if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
880 # if defined(RTLD_DEFAULT)
881 dl_prog_handle = RTLD_DEFAULT;
883 dl_prog_handle = dlopen(NULL, RTLD_LAZY);
884 # endif /* RTLD_DEFAULT */
888 /* -----------------------------------------------------------------------------
889 * Loading DLL or .so dynamic libraries
890 * -----------------------------------------------------------------------------
892 * Add a DLL from which symbols may be found. In the ELF case, just
893 * do RTLD_GLOBAL-style add, so no further messing around needs to
894 * happen in order that symbols in the loaded .so are findable --
895 * lookupSymbol() will subsequently see them by dlsym on the program's
896 * dl-handle. Returns NULL if success, otherwise ptr to an err msg.
898 * In the PEi386 case, open the DLLs and put handles to them in a
899 * linked list. When looking for a symbol, try all handles in the
900 * list. This means that we need to load even DLLs that are guaranteed
901 * to be in the ghc.exe image already, just so we can get a handle
902 * to give to loadSymbol, so that we can find the symbols. For such
903 * libraries, the LoadLibrary call should be a no-op except for returning
908 #if defined(OBJFORMAT_PEi386)
909 /* A record for storing handles into DLLs. */
914 struct _OpenedDLL* next;
919 /* A list thereof. */
920 static OpenedDLL* opened_dlls = NULL;
924 addDLL( char *dll_name )
926 # if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
927 /* ------------------- ELF DLL loader ------------------- */
933 hdl= dlopen(dll_name, RTLD_NOW | RTLD_GLOBAL);
936 /* dlopen failed; return a ptr to the error msg. */
938 if (errmsg == NULL) errmsg = "addDLL: unknown error";
945 # elif defined(OBJFORMAT_PEi386)
946 /* ------------------- Win32 DLL loader ------------------- */
954 /* debugBelch("\naddDLL; dll_name = `%s'\n", dll_name); */
956 /* See if we've already got it, and ignore if so. */
957 for (o_dll = opened_dlls; o_dll != NULL; o_dll = o_dll->next) {
958 if (0 == strcmp(o_dll->name, dll_name))
962 /* The file name has no suffix (yet) so that we can try
963 both foo.dll and foo.drv
965 The documentation for LoadLibrary says:
966 If no file name extension is specified in the lpFileName
967 parameter, the default library extension .dll is
968 appended. However, the file name string can include a trailing
969 point character (.) to indicate that the module name has no
972 buf = stgMallocBytes(strlen(dll_name) + 10, "addDLL");
973 sprintf(buf, "%s.DLL", dll_name);
974 instance = LoadLibrary(buf);
975 if (instance == NULL) {
976 sprintf(buf, "%s.DRV", dll_name); // KAA: allow loading of drivers (like winspool.drv)
977 instance = LoadLibrary(buf);
978 if (instance == NULL) {
981 /* LoadLibrary failed; return a ptr to the error msg. */
982 return "addDLL: unknown error";
987 /* Add this DLL to the list of DLLs in which to search for symbols. */
988 o_dll = stgMallocBytes( sizeof(OpenedDLL), "addDLL" );
989 o_dll->name = stgMallocBytes(1+strlen(dll_name), "addDLL");
990 strcpy(o_dll->name, dll_name);
991 o_dll->instance = instance;
992 o_dll->next = opened_dlls;
997 barf("addDLL: not implemented on this platform");
1001 /* -----------------------------------------------------------------------------
1002 * insert a stable symbol in the hash table
1006 insertStableSymbol(char* obj_name, char* key, StgPtr p)
1008 ghciInsertStrHashTable(obj_name, stablehash, key, getStablePtr(p));
1012 /* -----------------------------------------------------------------------------
1013 * insert a symbol in the hash table
1016 insertSymbol(char* obj_name, char* key, void* data)
1018 ghciInsertStrHashTable(obj_name, symhash, key, data);
1021 /* -----------------------------------------------------------------------------
1022 * lookup a symbol in the hash table
1025 lookupSymbol( char *lbl )
1029 ASSERT(symhash != NULL);
1030 val = lookupStrHashTable(symhash, lbl);
1033 # if defined(OBJFORMAT_ELF)
1034 # if defined(x86_64_HOST_ARCH)
1035 val = dlsym(dl_prog_handle, lbl);
1036 if (val >= (void *)0x80000000) {
1038 new_val = x86_64_high_symbol(lbl, val);
1039 IF_DEBUG(linker,debugBelch("lookupSymbol: relocating out of range symbol: %s = %p, now %p\n", lbl, val, new_val));
1045 return dlsym(dl_prog_handle, lbl);
1047 # elif defined(OBJFORMAT_MACHO)
1048 if(NSIsSymbolNameDefined(lbl)) {
1049 NSSymbol symbol = NSLookupAndBindSymbol(lbl);
1050 return NSAddressOfSymbol(symbol);
1054 # elif defined(OBJFORMAT_PEi386)
1057 for (o_dll = opened_dlls; o_dll != NULL; o_dll = o_dll->next) {
1058 /* debugBelch("look in %s for %s\n", o_dll->name, lbl); */
1059 if (lbl[0] == '_') {
1060 /* HACK: if the name has an initial underscore, try stripping
1061 it off & look that up first. I've yet to verify whether there's
1062 a Rule that governs whether an initial '_' *should always* be
1063 stripped off when mapping from import lib name to the DLL name.
1065 sym = GetProcAddress(o_dll->instance, (lbl+1));
1067 /*debugBelch("found %s in %s\n", lbl+1,o_dll->name);*/
1071 sym = GetProcAddress(o_dll->instance, lbl);
1073 /*debugBelch("found %s in %s\n", lbl,o_dll->name);*/
1088 __attribute((unused))
1090 lookupLocalSymbol( ObjectCode* oc, char *lbl )
1094 val = lookupStrHashTable(oc->lochash, lbl);
1104 /* -----------------------------------------------------------------------------
1105 * Debugging aid: look in GHCi's object symbol tables for symbols
1106 * within DELTA bytes of the specified address, and show their names.
1109 void ghci_enquire ( char* addr );
1111 void ghci_enquire ( char* addr )
1116 const int DELTA = 64;
1121 for (oc = objects; oc; oc = oc->next) {
1122 for (i = 0; i < oc->n_symbols; i++) {
1123 sym = oc->symbols[i];
1124 if (sym == NULL) continue;
1125 // debugBelch("enquire %p %p\n", sym, oc->lochash);
1127 if (oc->lochash != NULL) {
1128 a = lookupStrHashTable(oc->lochash, sym);
1131 a = lookupStrHashTable(symhash, sym);
1134 // debugBelch("ghci_enquire: can't find %s\n", sym);
1136 else if (addr-DELTA <= a && a <= addr+DELTA) {
1137 debugBelch("%p + %3d == `%s'\n", addr, (int)(a - addr), sym);
1144 #ifdef ia64_HOST_ARCH
1145 static unsigned int PLTSize(void);
1148 /* -----------------------------------------------------------------------------
1149 * Load an obj (populate the global symbol table, but don't resolve yet)
1151 * Returns: 1 if ok, 0 on error.
1154 loadObj( char *path )
1161 void *map_addr = NULL;
1167 /* debugBelch("loadObj %s\n", path ); */
1169 /* Check that we haven't already loaded this object.
1170 Ignore requests to load multiple times */
1174 for (o = objects; o; o = o->next) {
1175 if (0 == strcmp(o->fileName, path)) {
1177 break; /* don't need to search further */
1181 IF_DEBUG(linker, debugBelch(
1182 "GHCi runtime linker: warning: looks like you're trying to load the\n"
1183 "same object file twice:\n"
1185 "GHCi will ignore this, but be warned.\n"
1187 return 1; /* success */
1191 oc = stgMallocBytes(sizeof(ObjectCode), "loadObj(oc)");
1193 # if defined(OBJFORMAT_ELF)
1194 oc->formatName = "ELF";
1195 # elif defined(OBJFORMAT_PEi386)
1196 oc->formatName = "PEi386";
1197 # elif defined(OBJFORMAT_MACHO)
1198 oc->formatName = "Mach-O";
1201 barf("loadObj: not implemented on this platform");
1204 r = stat(path, &st);
1205 if (r == -1) { return 0; }
1207 /* sigh, strdup() isn't a POSIX function, so do it the long way */
1208 oc->fileName = stgMallocBytes( strlen(path)+1, "loadObj" );
1209 strcpy(oc->fileName, path);
1211 oc->fileSize = st.st_size;
1213 oc->sections = NULL;
1214 oc->lochash = allocStrHashTable();
1215 oc->proddables = NULL;
1217 /* chain it onto the list of objects */
1222 #define ROUND_UP(x,size) ((x + size - 1) & ~(size - 1))
1224 /* On many architectures malloc'd memory isn't executable, so we need to use mmap. */
1226 #if defined(openbsd_HOST_OS)
1227 fd = open(path, O_RDONLY, S_IRUSR);
1229 fd = open(path, O_RDONLY);
1232 barf("loadObj: can't open `%s'", path);
1234 pagesize = getpagesize();
1236 #ifdef ia64_HOST_ARCH
1237 /* The PLT needs to be right before the object */
1238 n = ROUND_UP(PLTSize(), pagesize);
1239 oc->plt = mmap(NULL, n, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
1240 if (oc->plt == MAP_FAILED)
1241 barf("loadObj: can't allocate PLT");
1244 map_addr = oc->plt + n;
1247 n = ROUND_UP(oc->fileSize, pagesize);
1249 /* Link objects into the lower 2Gb on x86_64. GHC assumes the
1250 * small memory model on this architecture (see gcc docs,
1253 #ifdef x86_64_HOST_ARCH
1254 #define EXTRA_MAP_FLAGS MAP_32BIT
1256 #define EXTRA_MAP_FLAGS 0
1259 oc->image = mmap(map_addr, n, PROT_EXEC|PROT_READ|PROT_WRITE,
1260 MAP_PRIVATE|EXTRA_MAP_FLAGS, fd, 0);
1261 if (oc->image == MAP_FAILED)
1262 barf("loadObj: can't map `%s'", path);
1266 #else /* !USE_MMAP */
1268 /* load the image into memory */
1269 f = fopen(path, "rb");
1271 barf("loadObj: can't read `%s'", path);
1273 # if defined(mingw32_HOST_OS)
1274 // TODO: We would like to use allocateExec here, but allocateExec
1275 // cannot currently allocate blocks large enough.
1276 oc->image = VirtualAlloc(NULL, oc->fileSize, MEM_RESERVE | MEM_COMMIT,
1277 PAGE_EXECUTE_READWRITE);
1278 # elif defined(darwin_HOST_OS)
1279 // In a Mach-O .o file, all sections can and will be misaligned
1280 // if the total size of the headers is not a multiple of the
1281 // desired alignment. This is fine for .o files that only serve
1282 // as input for the static linker, but it's not fine for us,
1283 // as SSE (used by gcc for floating point) and Altivec require
1284 // 16-byte alignment.
1285 // We calculate the correct alignment from the header before
1286 // reading the file, and then we misalign oc->image on purpose so
1287 // that the actual sections end up aligned again.
1288 oc->misalignment = machoGetMisalignment(f);
1289 oc->image = stgMallocBytes(oc->fileSize + oc->misalignment, "loadObj(image)");
1290 oc->image += oc->misalignment;
1292 oc->image = stgMallocBytes(oc->fileSize, "loadObj(image)");
1295 n = fread ( oc->image, 1, oc->fileSize, f );
1296 if (n != oc->fileSize)
1297 barf("loadObj: error whilst reading `%s'", path);
1301 #endif /* USE_MMAP */
1303 # if defined(OBJFORMAT_MACHO) && defined(powerpc_HOST_ARCH)
1304 r = ocAllocateJumpIslands_MachO ( oc );
1305 if (!r) { return r; }
1306 # elif defined(OBJFORMAT_ELF) && defined(powerpc_HOST_ARCH)
1307 r = ocAllocateJumpIslands_ELF ( oc );
1308 if (!r) { return r; }
1311 /* verify the in-memory image */
1312 # if defined(OBJFORMAT_ELF)
1313 r = ocVerifyImage_ELF ( oc );
1314 # elif defined(OBJFORMAT_PEi386)
1315 r = ocVerifyImage_PEi386 ( oc );
1316 # elif defined(OBJFORMAT_MACHO)
1317 r = ocVerifyImage_MachO ( oc );
1319 barf("loadObj: no verify method");
1321 if (!r) { return r; }
1323 /* build the symbol list for this image */
1324 # if defined(OBJFORMAT_ELF)
1325 r = ocGetNames_ELF ( oc );
1326 # elif defined(OBJFORMAT_PEi386)
1327 r = ocGetNames_PEi386 ( oc );
1328 # elif defined(OBJFORMAT_MACHO)
1329 r = ocGetNames_MachO ( oc );
1331 barf("loadObj: no getNames method");
1333 if (!r) { return r; }
1335 /* loaded, but not resolved yet */
1336 oc->status = OBJECT_LOADED;
1341 /* -----------------------------------------------------------------------------
1342 * resolve all the currently unlinked objects in memory
1344 * Returns: 1 if ok, 0 on error.
1354 for (oc = objects; oc; oc = oc->next) {
1355 if (oc->status != OBJECT_RESOLVED) {
1356 # if defined(OBJFORMAT_ELF)
1357 r = ocResolve_ELF ( oc );
1358 # elif defined(OBJFORMAT_PEi386)
1359 r = ocResolve_PEi386 ( oc );
1360 # elif defined(OBJFORMAT_MACHO)
1361 r = ocResolve_MachO ( oc );
1363 barf("resolveObjs: not implemented on this platform");
1365 if (!r) { return r; }
1366 oc->status = OBJECT_RESOLVED;
1372 /* -----------------------------------------------------------------------------
1373 * delete an object from the pool
1376 unloadObj( char *path )
1378 ObjectCode *oc, *prev;
1380 ASSERT(symhash != NULL);
1381 ASSERT(objects != NULL);
1386 for (oc = objects; oc; prev = oc, oc = oc->next) {
1387 if (!strcmp(oc->fileName,path)) {
1389 /* Remove all the mappings for the symbols within this
1394 for (i = 0; i < oc->n_symbols; i++) {
1395 if (oc->symbols[i] != NULL) {
1396 removeStrHashTable(symhash, oc->symbols[i], NULL);
1404 prev->next = oc->next;
1407 // We're going to leave this in place, in case there are
1408 // any pointers from the heap into it:
1409 // #ifdef mingw32_HOST_OS
1410 // VirtualFree(oc->image);
1412 // stgFree(oc->image);
1414 stgFree(oc->fileName);
1415 stgFree(oc->symbols);
1416 stgFree(oc->sections);
1417 /* The local hash table should have been freed at the end
1418 of the ocResolve_ call on it. */
1419 ASSERT(oc->lochash == NULL);
1425 errorBelch("unloadObj: can't find `%s' to unload", path);
1429 /* -----------------------------------------------------------------------------
1430 * Sanity checking. For each ObjectCode, maintain a list of address ranges
1431 * which may be prodded during relocation, and abort if we try and write
1432 * outside any of these.
1434 static void addProddableBlock ( ObjectCode* oc, void* start, int size )
1437 = stgMallocBytes(sizeof(ProddableBlock), "addProddableBlock");
1438 /* debugBelch("aPB %p %p %d\n", oc, start, size); */
1442 pb->next = oc->proddables;
1443 oc->proddables = pb;
1446 static void checkProddableBlock ( ObjectCode* oc, void* addr )
1449 for (pb = oc->proddables; pb != NULL; pb = pb->next) {
1450 char* s = (char*)(pb->start);
1451 char* e = s + pb->size - 1;
1452 char* a = (char*)addr;
1453 /* Assumes that the biggest fixup involves a 4-byte write. This
1454 probably needs to be changed to 8 (ie, +7) on 64-bit
1456 if (a >= s && (a+3) <= e) return;
1458 barf("checkProddableBlock: invalid fixup in runtime linker");
1461 /* -----------------------------------------------------------------------------
1462 * Section management.
1464 static void addSection ( ObjectCode* oc, SectionKind kind,
1465 void* start, void* end )
1467 Section* s = stgMallocBytes(sizeof(Section), "addSection");
1471 s->next = oc->sections;
1474 debugBelch("addSection: %p-%p (size %d), kind %d\n",
1475 start, ((char*)end)-1, end - start + 1, kind );
1480 /* --------------------------------------------------------------------------
1481 * PowerPC specifics (jump islands)
1482 * ------------------------------------------------------------------------*/
1484 #if defined(powerpc_HOST_ARCH)
1487 ocAllocateJumpIslands
1489 Allocate additional space at the end of the object file image to make room
1492 PowerPC relative branch instructions have a 24 bit displacement field.
1493 As PPC code is always 4-byte-aligned, this yields a +-32MB range.
1494 If a particular imported symbol is outside this range, we have to redirect
1495 the jump to a short piece of new code that just loads the 32bit absolute
1496 address and jumps there.
1497 This function just allocates space for one 16 byte ppcJumpIsland for every
1498 undefined symbol in the object file. The code for the islands is filled in by
1499 makeJumpIsland below.
1502 static int ocAllocateJumpIslands( ObjectCode* oc, int count, int first )
1508 int misalignment = 0;
1510 misalignment = oc->misalignment;
1515 // round up to the nearest 4
1516 aligned = (oc->fileSize + 3) & ~3;
1519 #ifndef linux_HOST_OS /* mremap is a linux extension */
1520 #error ocAllocateJumpIslands doesnt want USE_MMAP to be defined
1523 pagesize = getpagesize();
1524 n = ROUND_UP( oc->fileSize, pagesize );
1525 m = ROUND_UP( aligned + sizeof (ppcJumpIsland) * count, pagesize );
1527 /* If we have a half-page-size file and map one page of it then
1528 * the part of the page after the size of the file remains accessible.
1529 * If, however, we map in 2 pages, the 2nd page is not accessible
1530 * and will give a "Bus Error" on access. To get around this, we check
1531 * if we need any extra pages for the jump islands and map them in
1532 * anonymously. We must check that we actually require extra pages
1533 * otherwise the attempt to mmap 0 pages of anonymous memory will
1539 /* The effect of this mremap() call is only the ensure that we have
1540 * a sufficient number of virtually contiguous pages. As returned from
1541 * mremap, the pages past the end of the file are not backed. We give
1542 * them a backing by using MAP_FIXED to map in anonymous pages.
1544 oc->image = mremap( oc->image, n, m, MREMAP_MAYMOVE );
1546 if( oc->image == MAP_FAILED )
1548 errorBelch( "Unable to mremap for Jump Islands\n" );
1552 if( mmap( oc->image + n, m - n, PROT_READ | PROT_WRITE | PROT_EXEC,
1553 MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, 0, 0 ) == MAP_FAILED )
1555 errorBelch( "Unable to mmap( MAP_FIXED ) for Jump Islands\n" );
1561 oc->image -= misalignment;
1562 oc->image = stgReallocBytes( oc->image,
1564 aligned + sizeof (ppcJumpIsland) * count,
1565 "ocAllocateJumpIslands" );
1566 oc->image += misalignment;
1567 #endif /* USE_MMAP */
1569 oc->jump_islands = (ppcJumpIsland *) (oc->image + aligned);
1570 memset( oc->jump_islands, 0, sizeof (ppcJumpIsland) * count );
1573 oc->jump_islands = NULL;
1575 oc->island_start_symbol = first;
1576 oc->n_islands = count;
1581 static unsigned long makeJumpIsland( ObjectCode* oc,
1582 unsigned long symbolNumber,
1583 unsigned long target )
1585 ppcJumpIsland *island;
1587 if( symbolNumber < oc->island_start_symbol ||
1588 symbolNumber - oc->island_start_symbol > oc->n_islands)
1591 island = &oc->jump_islands[symbolNumber - oc->island_start_symbol];
1593 // lis r12, hi16(target)
1594 island->lis_r12 = 0x3d80;
1595 island->hi_addr = target >> 16;
1597 // ori r12, r12, lo16(target)
1598 island->ori_r12_r12 = 0x618c;
1599 island->lo_addr = target & 0xffff;
1602 island->mtctr_r12 = 0x7d8903a6;
1605 island->bctr = 0x4e800420;
1607 return (unsigned long) island;
1611 ocFlushInstructionCache
1613 Flush the data & instruction caches.
1614 Because the PPC has split data/instruction caches, we have to
1615 do that whenever we modify code at runtime.
1618 static void ocFlushInstructionCache( ObjectCode *oc )
1620 int n = (oc->fileSize + sizeof( ppcJumpIsland ) * oc->n_islands + 3) / 4;
1621 unsigned long *p = (unsigned long *) oc->image;
1625 __asm__ volatile ( "dcbf 0,%0\n\t"
1633 __asm__ volatile ( "sync\n\t"
1639 /* --------------------------------------------------------------------------
1640 * PEi386 specifics (Win32 targets)
1641 * ------------------------------------------------------------------------*/
1643 /* The information for this linker comes from
1644 Microsoft Portable Executable
1645 and Common Object File Format Specification
1646 revision 5.1 January 1998
1647 which SimonM says comes from the MS Developer Network CDs.
1649 It can be found there (on older CDs), but can also be found
1652 http://www.microsoft.com/hwdev/hardware/PECOFF.asp
1654 (this is Rev 6.0 from February 1999).
1656 Things move, so if that fails, try searching for it via
1658 http://www.google.com/search?q=PE+COFF+specification
1660 The ultimate reference for the PE format is the Winnt.h
1661 header file that comes with the Platform SDKs; as always,
1662 implementations will drift wrt their documentation.
1664 A good background article on the PE format is Matt Pietrek's
1665 March 1994 article in Microsoft System Journal (MSJ)
1666 (Vol.9, No. 3): "Peering Inside the PE: A Tour of the
1667 Win32 Portable Executable File Format." The info in there
1668 has recently been updated in a two part article in
1669 MSDN magazine, issues Feb and March 2002,
1670 "Inside Windows: An In-Depth Look into the Win32 Portable
1671 Executable File Format"
1673 John Levine's book "Linkers and Loaders" contains useful
1678 #if defined(OBJFORMAT_PEi386)
1682 typedef unsigned char UChar;
1683 typedef unsigned short UInt16;
1684 typedef unsigned int UInt32;
1691 UInt16 NumberOfSections;
1692 UInt32 TimeDateStamp;
1693 UInt32 PointerToSymbolTable;
1694 UInt32 NumberOfSymbols;
1695 UInt16 SizeOfOptionalHeader;
1696 UInt16 Characteristics;
1700 #define sizeof_COFF_header 20
1707 UInt32 VirtualAddress;
1708 UInt32 SizeOfRawData;
1709 UInt32 PointerToRawData;
1710 UInt32 PointerToRelocations;
1711 UInt32 PointerToLinenumbers;
1712 UInt16 NumberOfRelocations;
1713 UInt16 NumberOfLineNumbers;
1714 UInt32 Characteristics;
1718 #define sizeof_COFF_section 40
1725 UInt16 SectionNumber;
1728 UChar NumberOfAuxSymbols;
1732 #define sizeof_COFF_symbol 18
1737 UInt32 VirtualAddress;
1738 UInt32 SymbolTableIndex;
1743 #define sizeof_COFF_reloc 10
1746 /* From PE spec doc, section 3.3.2 */
1747 /* Note use of MYIMAGE_* since IMAGE_* are already defined in
1748 windows.h -- for the same purpose, but I want to know what I'm
1750 #define MYIMAGE_FILE_RELOCS_STRIPPED 0x0001
1751 #define MYIMAGE_FILE_EXECUTABLE_IMAGE 0x0002
1752 #define MYIMAGE_FILE_DLL 0x2000
1753 #define MYIMAGE_FILE_SYSTEM 0x1000
1754 #define MYIMAGE_FILE_BYTES_REVERSED_HI 0x8000
1755 #define MYIMAGE_FILE_BYTES_REVERSED_LO 0x0080
1756 #define MYIMAGE_FILE_32BIT_MACHINE 0x0100
1758 /* From PE spec doc, section 5.4.2 and 5.4.4 */
1759 #define MYIMAGE_SYM_CLASS_EXTERNAL 2
1760 #define MYIMAGE_SYM_CLASS_STATIC 3
1761 #define MYIMAGE_SYM_UNDEFINED 0
1763 /* From PE spec doc, section 4.1 */
1764 #define MYIMAGE_SCN_CNT_CODE 0x00000020
1765 #define MYIMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
1766 #define MYIMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
1768 /* From PE spec doc, section 5.2.1 */
1769 #define MYIMAGE_REL_I386_DIR32 0x0006
1770 #define MYIMAGE_REL_I386_REL32 0x0014
1773 /* We use myindex to calculate array addresses, rather than
1774 simply doing the normal subscript thing. That's because
1775 some of the above structs have sizes which are not
1776 a whole number of words. GCC rounds their sizes up to a
1777 whole number of words, which means that the address calcs
1778 arising from using normal C indexing or pointer arithmetic
1779 are just plain wrong. Sigh.
1782 myindex ( int scale, void* base, int index )
1785 ((UChar*)base) + scale * index;
1790 printName ( UChar* name, UChar* strtab )
1792 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1793 UInt32 strtab_offset = * (UInt32*)(name+4);
1794 debugBelch("%s", strtab + strtab_offset );
1797 for (i = 0; i < 8; i++) {
1798 if (name[i] == 0) break;
1799 debugBelch("%c", name[i] );
1806 copyName ( UChar* name, UChar* strtab, UChar* dst, int dstSize )
1808 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1809 UInt32 strtab_offset = * (UInt32*)(name+4);
1810 strncpy ( dst, strtab+strtab_offset, dstSize );
1816 if (name[i] == 0) break;
1826 cstring_from_COFF_symbol_name ( UChar* name, UChar* strtab )
1829 /* If the string is longer than 8 bytes, look in the
1830 string table for it -- this will be correctly zero terminated.
1832 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1833 UInt32 strtab_offset = * (UInt32*)(name+4);
1834 return ((UChar*)strtab) + strtab_offset;
1836 /* Otherwise, if shorter than 8 bytes, return the original,
1837 which by defn is correctly terminated.
1839 if (name[7]==0) return name;
1840 /* The annoying case: 8 bytes. Copy into a temporary
1841 (which is never freed ...)
1843 newstr = stgMallocBytes(9, "cstring_from_COFF_symbol_name");
1845 strncpy(newstr,name,8);
1851 /* Just compares the short names (first 8 chars) */
1852 static COFF_section *
1853 findPEi386SectionCalled ( ObjectCode* oc, char* name )
1857 = (COFF_header*)(oc->image);
1858 COFF_section* sectab
1860 ((UChar*)(oc->image))
1861 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1863 for (i = 0; i < hdr->NumberOfSections; i++) {
1866 COFF_section* section_i
1868 myindex ( sizeof_COFF_section, sectab, i );
1869 n1 = (UChar*) &(section_i->Name);
1871 if (n1[0]==n2[0] && n1[1]==n2[1] && n1[2]==n2[2] &&
1872 n1[3]==n2[3] && n1[4]==n2[4] && n1[5]==n2[5] &&
1873 n1[6]==n2[6] && n1[7]==n2[7])
1882 zapTrailingAtSign ( UChar* sym )
1884 # define my_isdigit(c) ((c) >= '0' && (c) <= '9')
1886 if (sym[0] == 0) return;
1888 while (sym[i] != 0) i++;
1891 while (j > 0 && my_isdigit(sym[j])) j--;
1892 if (j > 0 && sym[j] == '@' && j != i) sym[j] = 0;
1898 ocVerifyImage_PEi386 ( ObjectCode* oc )
1903 COFF_section* sectab;
1904 COFF_symbol* symtab;
1906 /* debugBelch("\nLOADING %s\n", oc->fileName); */
1907 hdr = (COFF_header*)(oc->image);
1908 sectab = (COFF_section*) (
1909 ((UChar*)(oc->image))
1910 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1912 symtab = (COFF_symbol*) (
1913 ((UChar*)(oc->image))
1914 + hdr->PointerToSymbolTable
1916 strtab = ((UChar*)symtab)
1917 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
1919 if (hdr->Machine != 0x14c) {
1920 errorBelch("%s: Not x86 PEi386", oc->fileName);
1923 if (hdr->SizeOfOptionalHeader != 0) {
1924 errorBelch("%s: PEi386 with nonempty optional header", oc->fileName);
1927 if ( /* (hdr->Characteristics & MYIMAGE_FILE_RELOCS_STRIPPED) || */
1928 (hdr->Characteristics & MYIMAGE_FILE_EXECUTABLE_IMAGE) ||
1929 (hdr->Characteristics & MYIMAGE_FILE_DLL) ||
1930 (hdr->Characteristics & MYIMAGE_FILE_SYSTEM) ) {
1931 errorBelch("%s: Not a PEi386 object file", oc->fileName);
1934 if ( (hdr->Characteristics & MYIMAGE_FILE_BYTES_REVERSED_HI)
1935 /* || !(hdr->Characteristics & MYIMAGE_FILE_32BIT_MACHINE) */ ) {
1936 errorBelch("%s: Invalid PEi386 word size or endiannness: %d",
1938 (int)(hdr->Characteristics));
1941 /* If the string table size is way crazy, this might indicate that
1942 there are more than 64k relocations, despite claims to the
1943 contrary. Hence this test. */
1944 /* debugBelch("strtab size %d\n", * (UInt32*)strtab); */
1946 if ( (*(UInt32*)strtab) > 600000 ) {
1947 /* Note that 600k has no special significance other than being
1948 big enough to handle the almost-2MB-sized lumps that
1949 constitute HSwin32*.o. */
1950 debugBelch("PEi386 object has suspiciously large string table; > 64k relocs?");
1955 /* No further verification after this point; only debug printing. */
1957 IF_DEBUG(linker, i=1);
1958 if (i == 0) return 1;
1960 debugBelch( "sectab offset = %d\n", ((UChar*)sectab) - ((UChar*)hdr) );
1961 debugBelch( "symtab offset = %d\n", ((UChar*)symtab) - ((UChar*)hdr) );
1962 debugBelch( "strtab offset = %d\n", ((UChar*)strtab) - ((UChar*)hdr) );
1965 debugBelch( "Machine: 0x%x\n", (UInt32)(hdr->Machine) );
1966 debugBelch( "# sections: %d\n", (UInt32)(hdr->NumberOfSections) );
1967 debugBelch( "time/date: 0x%x\n", (UInt32)(hdr->TimeDateStamp) );
1968 debugBelch( "symtab offset: %d\n", (UInt32)(hdr->PointerToSymbolTable) );
1969 debugBelch( "# symbols: %d\n", (UInt32)(hdr->NumberOfSymbols) );
1970 debugBelch( "sz of opt hdr: %d\n", (UInt32)(hdr->SizeOfOptionalHeader) );
1971 debugBelch( "characteristics: 0x%x\n", (UInt32)(hdr->Characteristics) );
1973 /* Print the section table. */
1975 for (i = 0; i < hdr->NumberOfSections; i++) {
1977 COFF_section* sectab_i
1979 myindex ( sizeof_COFF_section, sectab, i );
1986 printName ( sectab_i->Name, strtab );
1996 sectab_i->VirtualSize,
1997 sectab_i->VirtualAddress,
1998 sectab_i->SizeOfRawData,
1999 sectab_i->PointerToRawData,
2000 sectab_i->NumberOfRelocations,
2001 sectab_i->PointerToRelocations,
2002 sectab_i->PointerToRawData
2004 reltab = (COFF_reloc*) (
2005 ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
2008 if ( sectab_i->Characteristics & MYIMAGE_SCN_LNK_NRELOC_OVFL ) {
2009 /* If the relocation field (a short) has overflowed, the
2010 * real count can be found in the first reloc entry.
2012 * See Section 4.1 (last para) of the PE spec (rev6.0).
2014 COFF_reloc* rel = (COFF_reloc*)
2015 myindex ( sizeof_COFF_reloc, reltab, 0 );
2016 noRelocs = rel->VirtualAddress;
2019 noRelocs = sectab_i->NumberOfRelocations;
2023 for (; j < noRelocs; j++) {
2025 COFF_reloc* rel = (COFF_reloc*)
2026 myindex ( sizeof_COFF_reloc, reltab, j );
2028 " type 0x%-4x vaddr 0x%-8x name `",
2030 rel->VirtualAddress );
2031 sym = (COFF_symbol*)
2032 myindex ( sizeof_COFF_symbol, symtab, rel->SymbolTableIndex );
2033 /* Hmm..mysterious looking offset - what's it for? SOF */
2034 printName ( sym->Name, strtab -10 );
2041 debugBelch("string table has size 0x%x\n", * (UInt32*)strtab );
2042 debugBelch("---START of string table---\n");
2043 for (i = 4; i < *(Int32*)strtab; i++) {
2045 debugBelch("\n"); else
2046 debugBelch("%c", strtab[i] );
2048 debugBelch("--- END of string table---\n");
2053 COFF_symbol* symtab_i;
2054 if (i >= (Int32)(hdr->NumberOfSymbols)) break;
2055 symtab_i = (COFF_symbol*)
2056 myindex ( sizeof_COFF_symbol, symtab, i );
2062 printName ( symtab_i->Name, strtab );
2071 (Int32)(symtab_i->SectionNumber),
2072 (UInt32)symtab_i->Type,
2073 (UInt32)symtab_i->StorageClass,
2074 (UInt32)symtab_i->NumberOfAuxSymbols
2076 i += symtab_i->NumberOfAuxSymbols;
2086 ocGetNames_PEi386 ( ObjectCode* oc )
2089 COFF_section* sectab;
2090 COFF_symbol* symtab;
2097 hdr = (COFF_header*)(oc->image);
2098 sectab = (COFF_section*) (
2099 ((UChar*)(oc->image))
2100 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
2102 symtab = (COFF_symbol*) (
2103 ((UChar*)(oc->image))
2104 + hdr->PointerToSymbolTable
2106 strtab = ((UChar*)(oc->image))
2107 + hdr->PointerToSymbolTable
2108 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
2110 /* Allocate space for any (local, anonymous) .bss sections. */
2112 for (i = 0; i < hdr->NumberOfSections; i++) {
2115 COFF_section* sectab_i
2117 myindex ( sizeof_COFF_section, sectab, i );
2118 if (0 != strcmp(sectab_i->Name, ".bss")) continue;
2119 /* sof 10/05: the PE spec text isn't too clear regarding what
2120 * the SizeOfRawData field is supposed to hold for object
2121 * file sections containing just uninitialized data -- for executables,
2122 * it is supposed to be zero; unclear what it's supposed to be
2123 * for object files. However, VirtualSize is guaranteed to be
2124 * zero for object files, which definitely suggests that SizeOfRawData
2125 * will be non-zero (where else would the size of this .bss section be
2126 * stored?) Looking at the COFF_section info for incoming object files,
2127 * this certainly appears to be the case.
2129 * => I suspect we've been incorrectly handling .bss sections in (relocatable)
2130 * object files up until now. This turned out to bite us with ghc-6.4.1's use
2131 * of gcc-3.4.x, which has started to emit initially-zeroed-out local 'static'
2132 * variable decls into to the .bss section. (The specific function in Q which
2133 * triggered this is libraries/base/cbits/dirUtils.c:__hscore_getFolderPath())
2135 if (sectab_i->VirtualSize == 0 && sectab_i->SizeOfRawData == 0) continue;
2136 /* This is a non-empty .bss section. Allocate zeroed space for
2137 it, and set its PointerToRawData field such that oc->image +
2138 PointerToRawData == addr_of_zeroed_space. */
2139 bss_sz = sectab_i->VirtualSize;
2140 if ( bss_sz < sectab_i->SizeOfRawData) { bss_sz = sectab_i->SizeOfRawData; }
2141 zspace = stgCallocBytes(1, bss_sz, "ocGetNames_PEi386(anonymous bss)");
2142 sectab_i->PointerToRawData = ((UChar*)zspace) - ((UChar*)(oc->image));
2143 addProddableBlock(oc, zspace, bss_sz);
2144 /* debugBelch("BSS anon section at 0x%x\n", zspace); */
2147 /* Copy section information into the ObjectCode. */
2149 for (i = 0; i < hdr->NumberOfSections; i++) {
2155 = SECTIONKIND_OTHER;
2156 COFF_section* sectab_i
2158 myindex ( sizeof_COFF_section, sectab, i );
2159 IF_DEBUG(linker, debugBelch("section name = %s\n", sectab_i->Name ));
2162 /* I'm sure this is the Right Way to do it. However, the
2163 alternative of testing the sectab_i->Name field seems to
2164 work ok with Cygwin.
2166 if (sectab_i->Characteristics & MYIMAGE_SCN_CNT_CODE ||
2167 sectab_i->Characteristics & MYIMAGE_SCN_CNT_INITIALIZED_DATA)
2168 kind = SECTIONKIND_CODE_OR_RODATA;
2171 if (0==strcmp(".text",sectab_i->Name) ||
2172 0==strcmp(".rdata",sectab_i->Name)||
2173 0==strcmp(".rodata",sectab_i->Name))
2174 kind = SECTIONKIND_CODE_OR_RODATA;
2175 if (0==strcmp(".data",sectab_i->Name) ||
2176 0==strcmp(".bss",sectab_i->Name))
2177 kind = SECTIONKIND_RWDATA;
2179 ASSERT(sectab_i->SizeOfRawData == 0 || sectab_i->VirtualSize == 0);
2180 sz = sectab_i->SizeOfRawData;
2181 if (sz < sectab_i->VirtualSize) sz = sectab_i->VirtualSize;
2183 start = ((UChar*)(oc->image)) + sectab_i->PointerToRawData;
2184 end = start + sz - 1;
2186 if (kind == SECTIONKIND_OTHER
2187 /* Ignore sections called which contain stabs debugging
2189 && 0 != strcmp(".stab", sectab_i->Name)
2190 && 0 != strcmp(".stabstr", sectab_i->Name)
2191 /* ignore constructor section for now */
2192 && 0 != strcmp(".ctors", sectab_i->Name)
2193 /* ignore section generated from .ident */
2194 && 0!= strcmp("/4", sectab_i->Name)
2196 errorBelch("Unknown PEi386 section name `%s' (while processing: %s)", sectab_i->Name, oc->fileName);
2200 if (kind != SECTIONKIND_OTHER && end >= start) {
2201 addSection(oc, kind, start, end);
2202 addProddableBlock(oc, start, end - start + 1);
2206 /* Copy exported symbols into the ObjectCode. */
2208 oc->n_symbols = hdr->NumberOfSymbols;
2209 oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
2210 "ocGetNames_PEi386(oc->symbols)");
2211 /* Call me paranoid; I don't care. */
2212 for (i = 0; i < oc->n_symbols; i++)
2213 oc->symbols[i] = NULL;
2217 COFF_symbol* symtab_i;
2218 if (i >= (Int32)(hdr->NumberOfSymbols)) break;
2219 symtab_i = (COFF_symbol*)
2220 myindex ( sizeof_COFF_symbol, symtab, i );
2224 if (symtab_i->StorageClass == MYIMAGE_SYM_CLASS_EXTERNAL
2225 && symtab_i->SectionNumber != MYIMAGE_SYM_UNDEFINED) {
2226 /* This symbol is global and defined, viz, exported */
2227 /* for MYIMAGE_SYMCLASS_EXTERNAL
2228 && !MYIMAGE_SYM_UNDEFINED,
2229 the address of the symbol is:
2230 address of relevant section + offset in section
2232 COFF_section* sectabent
2233 = (COFF_section*) myindex ( sizeof_COFF_section,
2235 symtab_i->SectionNumber-1 );
2236 addr = ((UChar*)(oc->image))
2237 + (sectabent->PointerToRawData
2241 if (symtab_i->SectionNumber == MYIMAGE_SYM_UNDEFINED
2242 && symtab_i->Value > 0) {
2243 /* This symbol isn't in any section at all, ie, global bss.
2244 Allocate zeroed space for it. */
2245 addr = stgCallocBytes(1, symtab_i->Value,
2246 "ocGetNames_PEi386(non-anonymous bss)");
2247 addSection(oc, SECTIONKIND_RWDATA, addr,
2248 ((UChar*)addr) + symtab_i->Value - 1);
2249 addProddableBlock(oc, addr, symtab_i->Value);
2250 /* debugBelch("BSS section at 0x%x\n", addr); */
2253 if (addr != NULL ) {
2254 sname = cstring_from_COFF_symbol_name ( symtab_i->Name, strtab );
2255 /* debugBelch("addSymbol %p `%s \n", addr,sname); */
2256 IF_DEBUG(linker, debugBelch("addSymbol %p `%s'\n", addr,sname);)
2257 ASSERT(i >= 0 && i < oc->n_symbols);
2258 /* cstring_from_COFF_symbol_name always succeeds. */
2259 oc->symbols[i] = sname;
2260 ghciInsertStrHashTable(oc->fileName, symhash, sname, addr);
2264 "IGNORING symbol %d\n"
2268 printName ( symtab_i->Name, strtab );
2277 (Int32)(symtab_i->SectionNumber),
2278 (UInt32)symtab_i->Type,
2279 (UInt32)symtab_i->StorageClass,
2280 (UInt32)symtab_i->NumberOfAuxSymbols
2285 i += symtab_i->NumberOfAuxSymbols;
2294 ocResolve_PEi386 ( ObjectCode* oc )
2297 COFF_section* sectab;
2298 COFF_symbol* symtab;
2308 /* ToDo: should be variable-sized? But is at least safe in the
2309 sense of buffer-overrun-proof. */
2311 /* debugBelch("resolving for %s\n", oc->fileName); */
2313 hdr = (COFF_header*)(oc->image);
2314 sectab = (COFF_section*) (
2315 ((UChar*)(oc->image))
2316 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
2318 symtab = (COFF_symbol*) (
2319 ((UChar*)(oc->image))
2320 + hdr->PointerToSymbolTable
2322 strtab = ((UChar*)(oc->image))
2323 + hdr->PointerToSymbolTable
2324 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
2326 for (i = 0; i < hdr->NumberOfSections; i++) {
2327 COFF_section* sectab_i
2329 myindex ( sizeof_COFF_section, sectab, i );
2332 ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
2335 /* Ignore sections called which contain stabs debugging
2337 if (0 == strcmp(".stab", sectab_i->Name)
2338 || 0 == strcmp(".stabstr", sectab_i->Name)
2339 || 0 == strcmp(".ctors", sectab_i->Name))
2342 if ( sectab_i->Characteristics & MYIMAGE_SCN_LNK_NRELOC_OVFL ) {
2343 /* If the relocation field (a short) has overflowed, the
2344 * real count can be found in the first reloc entry.
2346 * See Section 4.1 (last para) of the PE spec (rev6.0).
2348 * Nov2003 update: the GNU linker still doesn't correctly
2349 * handle the generation of relocatable object files with
2350 * overflown relocations. Hence the output to warn of potential
2353 COFF_reloc* rel = (COFF_reloc*)
2354 myindex ( sizeof_COFF_reloc, reltab, 0 );
2355 noRelocs = rel->VirtualAddress;
2357 /* 10/05: we now assume (and check for) a GNU ld that is capable
2358 * of handling object files with (>2^16) of relocs.
2361 debugBelch("WARNING: Overflown relocation field (# relocs found: %u)\n",
2366 noRelocs = sectab_i->NumberOfRelocations;
2371 for (; j < noRelocs; j++) {
2373 COFF_reloc* reltab_j
2375 myindex ( sizeof_COFF_reloc, reltab, j );
2377 /* the location to patch */
2379 ((UChar*)(oc->image))
2380 + (sectab_i->PointerToRawData
2381 + reltab_j->VirtualAddress
2382 - sectab_i->VirtualAddress )
2384 /* the existing contents of pP */
2386 /* the symbol to connect to */
2387 sym = (COFF_symbol*)
2388 myindex ( sizeof_COFF_symbol,
2389 symtab, reltab_j->SymbolTableIndex );
2392 "reloc sec %2d num %3d: type 0x%-4x "
2393 "vaddr 0x%-8x name `",
2395 (UInt32)reltab_j->Type,
2396 reltab_j->VirtualAddress );
2397 printName ( sym->Name, strtab );
2398 debugBelch("'\n" ));
2400 if (sym->StorageClass == MYIMAGE_SYM_CLASS_STATIC) {
2401 COFF_section* section_sym
2402 = findPEi386SectionCalled ( oc, sym->Name );
2404 errorBelch("%s: can't find section `%s'", oc->fileName, sym->Name);
2407 S = ((UInt32)(oc->image))
2408 + (section_sym->PointerToRawData
2411 copyName ( sym->Name, strtab, symbol, 1000-1 );
2412 S = (UInt32) lookupLocalSymbol( oc, symbol );
2413 if ((void*)S != NULL) goto foundit;
2414 S = (UInt32) lookupSymbol( symbol );
2415 if ((void*)S != NULL) goto foundit;
2416 zapTrailingAtSign ( symbol );
2417 S = (UInt32) lookupLocalSymbol( oc, symbol );
2418 if ((void*)S != NULL) goto foundit;
2419 S = (UInt32) lookupSymbol( symbol );
2420 if ((void*)S != NULL) goto foundit;
2421 /* Newline first because the interactive linker has printed "linking..." */
2422 errorBelch("\n%s: unknown symbol `%s'", oc->fileName, symbol);
2426 checkProddableBlock(oc, pP);
2427 switch (reltab_j->Type) {
2428 case MYIMAGE_REL_I386_DIR32:
2431 case MYIMAGE_REL_I386_REL32:
2432 /* Tricky. We have to insert a displacement at
2433 pP which, when added to the PC for the _next_
2434 insn, gives the address of the target (S).
2435 Problem is to know the address of the next insn
2436 when we only know pP. We assume that this
2437 literal field is always the last in the insn,
2438 so that the address of the next insn is pP+4
2439 -- hence the constant 4.
2440 Also I don't know if A should be added, but so
2441 far it has always been zero.
2443 SOF 05/2005: 'A' (old contents of *pP) have been observed
2444 to contain values other than zero (the 'wx' object file
2445 that came with wxhaskell-0.9.4; dunno how it was compiled..).
2446 So, add displacement to old value instead of asserting
2447 A to be zero. Fixes wxhaskell-related crashes, and no other
2448 ill effects have been observed.
2450 Update: the reason why we're seeing these more elaborate
2451 relocations is due to a switch in how the NCG compiles SRTs
2452 and offsets to them from info tables. SRTs live in .(ro)data,
2453 while info tables live in .text, causing GAS to emit REL32/DISP32
2454 relocations with non-zero values. Adding the displacement is
2455 the right thing to do.
2457 *pP = S - ((UInt32)pP) - 4 + A;
2460 debugBelch("%s: unhandled PEi386 relocation type %d",
2461 oc->fileName, reltab_j->Type);
2468 IF_DEBUG(linker, debugBelch("completed %s", oc->fileName));
2472 #endif /* defined(OBJFORMAT_PEi386) */
2475 /* --------------------------------------------------------------------------
2477 * ------------------------------------------------------------------------*/
2479 #if defined(OBJFORMAT_ELF)
2484 #if defined(sparc_HOST_ARCH)
2485 # define ELF_TARGET_SPARC /* Used inside <elf.h> */
2486 #elif defined(i386_HOST_ARCH)
2487 # define ELF_TARGET_386 /* Used inside <elf.h> */
2488 #elif defined(x86_64_HOST_ARCH)
2489 # define ELF_TARGET_X64_64
2491 #elif defined (ia64_HOST_ARCH)
2492 # define ELF_TARGET_IA64 /* Used inside <elf.h> */
2494 # define ELF_FUNCTION_DESC /* calling convention uses function descriptors */
2495 # define ELF_NEED_GOT /* needs Global Offset Table */
2496 # define ELF_NEED_PLT /* needs Procedure Linkage Tables */
2499 #if !defined(openbsd_HOST_OS)
2502 /* openbsd elf has things in different places, with diff names */
2503 #include <elf_abi.h>
2504 #include <machine/reloc.h>
2505 #define R_386_32 RELOC_32
2506 #define R_386_PC32 RELOC_PC32
2510 * Define a set of types which can be used for both ELF32 and ELF64
2514 #define ELFCLASS ELFCLASS64
2515 #define Elf_Addr Elf64_Addr
2516 #define Elf_Word Elf64_Word
2517 #define Elf_Sword Elf64_Sword
2518 #define Elf_Ehdr Elf64_Ehdr
2519 #define Elf_Phdr Elf64_Phdr
2520 #define Elf_Shdr Elf64_Shdr
2521 #define Elf_Sym Elf64_Sym
2522 #define Elf_Rel Elf64_Rel
2523 #define Elf_Rela Elf64_Rela
2524 #define ELF_ST_TYPE ELF64_ST_TYPE
2525 #define ELF_ST_BIND ELF64_ST_BIND
2526 #define ELF_R_TYPE ELF64_R_TYPE
2527 #define ELF_R_SYM ELF64_R_SYM
2529 #define ELFCLASS ELFCLASS32
2530 #define Elf_Addr Elf32_Addr
2531 #define Elf_Word Elf32_Word
2532 #define Elf_Sword Elf32_Sword
2533 #define Elf_Ehdr Elf32_Ehdr
2534 #define Elf_Phdr Elf32_Phdr
2535 #define Elf_Shdr Elf32_Shdr
2536 #define Elf_Sym Elf32_Sym
2537 #define Elf_Rel Elf32_Rel
2538 #define Elf_Rela Elf32_Rela
2540 #define ELF_ST_TYPE ELF32_ST_TYPE
2543 #define ELF_ST_BIND ELF32_ST_BIND
2546 #define ELF_R_TYPE ELF32_R_TYPE
2549 #define ELF_R_SYM ELF32_R_SYM
2555 * Functions to allocate entries in dynamic sections. Currently we simply
2556 * preallocate a large number, and we don't check if a entry for the given
2557 * target already exists (a linear search is too slow). Ideally these
2558 * entries would be associated with symbols.
2561 /* These sizes sufficient to load HSbase + HShaskell98 + a few modules */
2562 #define GOT_SIZE 0x20000
2563 #define FUNCTION_TABLE_SIZE 0x10000
2564 #define PLT_SIZE 0x08000
2567 static Elf_Addr got[GOT_SIZE];
2568 static unsigned int gotIndex;
2569 static Elf_Addr gp_val = (Elf_Addr)got;
2572 allocateGOTEntry(Elf_Addr target)
2576 if (gotIndex >= GOT_SIZE)
2577 barf("Global offset table overflow");
2579 entry = &got[gotIndex++];
2581 return (Elf_Addr)entry;
2585 #ifdef ELF_FUNCTION_DESC
2591 static FunctionDesc functionTable[FUNCTION_TABLE_SIZE];
2592 static unsigned int functionTableIndex;
2595 allocateFunctionDesc(Elf_Addr target)
2597 FunctionDesc *entry;
2599 if (functionTableIndex >= FUNCTION_TABLE_SIZE)
2600 barf("Function table overflow");
2602 entry = &functionTable[functionTableIndex++];
2604 entry->gp = (Elf_Addr)gp_val;
2605 return (Elf_Addr)entry;
2609 copyFunctionDesc(Elf_Addr target)
2611 FunctionDesc *olddesc = (FunctionDesc *)target;
2612 FunctionDesc *newdesc;
2614 newdesc = (FunctionDesc *)allocateFunctionDesc(olddesc->ip);
2615 newdesc->gp = olddesc->gp;
2616 return (Elf_Addr)newdesc;
2621 #ifdef ia64_HOST_ARCH
2622 static void ia64_reloc_gprel22(Elf_Addr target, Elf_Addr value);
2623 static void ia64_reloc_pcrel21(Elf_Addr target, Elf_Addr value, ObjectCode *oc);
2625 static unsigned char plt_code[] =
2627 /* taken from binutils bfd/elfxx-ia64.c */
2628 0x0b, 0x78, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r15=0,r1;; */
2629 0x00, 0x41, 0x3c, 0x30, 0x28, 0xc0, /* ld8 r16=[r15],8 */
2630 0x01, 0x08, 0x00, 0x84, /* mov r14=r1;; */
2631 0x11, 0x08, 0x00, 0x1e, 0x18, 0x10, /* [MIB] ld8 r1=[r15] */
2632 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */
2633 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */
2636 /* If we can't get to the function descriptor via gp, take a local copy of it */
2637 #define PLT_RELOC(code, target) { \
2638 Elf64_Sxword rel_value = target - gp_val; \
2639 if ((rel_value > 0x1fffff) || (rel_value < -0x1fffff)) \
2640 ia64_reloc_gprel22((Elf_Addr)code, copyFunctionDesc(target)); \
2642 ia64_reloc_gprel22((Elf_Addr)code, target); \
2647 unsigned char code[sizeof(plt_code)];
2651 allocatePLTEntry(Elf_Addr target, ObjectCode *oc)
2653 PLTEntry *plt = (PLTEntry *)oc->plt;
2656 if (oc->pltIndex >= PLT_SIZE)
2657 barf("Procedure table overflow");
2659 entry = &plt[oc->pltIndex++];
2660 memcpy(entry->code, plt_code, sizeof(entry->code));
2661 PLT_RELOC(entry->code, target);
2662 return (Elf_Addr)entry;
2668 return (PLT_SIZE * sizeof(PLTEntry));
2673 #if x86_64_HOST_ARCH
2674 // On x86_64, 32-bit relocations are often used, which requires that
2675 // we can resolve a symbol to a 32-bit offset. However, shared
2676 // libraries are placed outside the 2Gb area, which leaves us with a
2677 // problem when we need to give a 32-bit offset to a symbol in a
2680 // For a function symbol, we can allocate a bounce sequence inside the
2681 // 2Gb area and resolve the symbol to this. The bounce sequence is
2682 // simply a long jump instruction to the real location of the symbol.
2684 // For data references, we're screwed.
2687 unsigned char jmp[8]; /* 6 byte instruction: jmpq *0x00000002(%rip) */
2691 #define X86_64_BB_SIZE 1024
2693 static x86_64_bounce *x86_64_bounce_buffer = NULL;
2694 static nat x86_64_bb_next_off;
2697 x86_64_high_symbol( char *lbl, void *addr )
2699 x86_64_bounce *bounce;
2701 if ( x86_64_bounce_buffer == NULL ||
2702 x86_64_bb_next_off >= X86_64_BB_SIZE ) {
2703 x86_64_bounce_buffer =
2704 mmap(NULL, X86_64_BB_SIZE * sizeof(x86_64_bounce),
2705 PROT_EXEC|PROT_READ|PROT_WRITE,
2706 MAP_PRIVATE|MAP_32BIT|MAP_ANONYMOUS, -1, 0);
2707 if (x86_64_bounce_buffer == MAP_FAILED) {
2708 barf("x86_64_high_symbol: mmap failed");
2710 x86_64_bb_next_off = 0;
2712 bounce = &x86_64_bounce_buffer[x86_64_bb_next_off];
2713 bounce->jmp[0] = 0xff;
2714 bounce->jmp[1] = 0x25;
2715 bounce->jmp[2] = 0x02;
2716 bounce->jmp[3] = 0x00;
2717 bounce->jmp[4] = 0x00;
2718 bounce->jmp[5] = 0x00;
2719 bounce->addr = addr;
2720 x86_64_bb_next_off++;
2722 IF_DEBUG(linker, debugBelch("x86_64: allocated bounce entry for %s->%p at %p\n",
2723 lbl, addr, bounce));
2725 insertStrHashTable(symhash, lbl, bounce);
2732 * Generic ELF functions
2736 findElfSection ( void* objImage, Elf_Word sh_type )
2738 char* ehdrC = (char*)objImage;
2739 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2740 Elf_Shdr* shdr = (Elf_Shdr*)(ehdrC + ehdr->e_shoff);
2741 char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
2745 for (i = 0; i < ehdr->e_shnum; i++) {
2746 if (shdr[i].sh_type == sh_type
2747 /* Ignore the section header's string table. */
2748 && i != ehdr->e_shstrndx
2749 /* Ignore string tables named .stabstr, as they contain
2751 && 0 != memcmp(".stabstr", sh_strtab + shdr[i].sh_name, 8)
2753 ptr = ehdrC + shdr[i].sh_offset;
2760 #if defined(ia64_HOST_ARCH)
2762 findElfSegment ( void* objImage, Elf_Addr vaddr )
2764 char* ehdrC = (char*)objImage;
2765 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2766 Elf_Phdr* phdr = (Elf_Phdr*)(ehdrC + ehdr->e_phoff);
2767 Elf_Addr segaddr = 0;
2770 for (i = 0; i < ehdr->e_phnum; i++) {
2771 segaddr = phdr[i].p_vaddr;
2772 if ((vaddr >= segaddr) && (vaddr < segaddr + phdr[i].p_memsz))
2780 ocVerifyImage_ELF ( ObjectCode* oc )
2784 int i, j, nent, nstrtab, nsymtabs;
2788 char* ehdrC = (char*)(oc->image);
2789 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2791 if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
2792 ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
2793 ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
2794 ehdr->e_ident[EI_MAG3] != ELFMAG3) {
2795 errorBelch("%s: not an ELF object", oc->fileName);
2799 if (ehdr->e_ident[EI_CLASS] != ELFCLASS) {
2800 errorBelch("%s: unsupported ELF format", oc->fileName);
2804 if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
2805 IF_DEBUG(linker,debugBelch( "Is little-endian\n" ));
2807 if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
2808 IF_DEBUG(linker,debugBelch( "Is big-endian\n" ));
2810 errorBelch("%s: unknown endiannness", oc->fileName);
2814 if (ehdr->e_type != ET_REL) {
2815 errorBelch("%s: not a relocatable object (.o) file", oc->fileName);
2818 IF_DEBUG(linker, debugBelch( "Is a relocatable object (.o) file\n" ));
2820 IF_DEBUG(linker,debugBelch( "Architecture is " ));
2821 switch (ehdr->e_machine) {
2822 case EM_386: IF_DEBUG(linker,debugBelch( "x86" )); break;
2823 #ifdef EM_SPARC32PLUS
2824 case EM_SPARC32PLUS:
2826 case EM_SPARC: IF_DEBUG(linker,debugBelch( "sparc" )); break;
2828 case EM_IA_64: IF_DEBUG(linker,debugBelch( "ia64" )); break;
2830 case EM_PPC: IF_DEBUG(linker,debugBelch( "powerpc32" )); break;
2832 case EM_X86_64: IF_DEBUG(linker,debugBelch( "x86_64" )); break;
2834 default: IF_DEBUG(linker,debugBelch( "unknown" ));
2835 errorBelch("%s: unknown architecture", oc->fileName);
2839 IF_DEBUG(linker,debugBelch(
2840 "\nSection header table: start %ld, n_entries %d, ent_size %d\n",
2841 (long)ehdr->e_shoff, ehdr->e_shnum, ehdr->e_shentsize ));
2843 ASSERT (ehdr->e_shentsize == sizeof(Elf_Shdr));
2845 shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
2847 if (ehdr->e_shstrndx == SHN_UNDEF) {
2848 errorBelch("%s: no section header string table", oc->fileName);
2851 IF_DEBUG(linker,debugBelch( "Section header string table is section %d\n",
2853 sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
2856 for (i = 0; i < ehdr->e_shnum; i++) {
2857 IF_DEBUG(linker,debugBelch("%2d: ", i ));
2858 IF_DEBUG(linker,debugBelch("type=%2d ", (int)shdr[i].sh_type ));
2859 IF_DEBUG(linker,debugBelch("size=%4d ", (int)shdr[i].sh_size ));
2860 IF_DEBUG(linker,debugBelch("offs=%4d ", (int)shdr[i].sh_offset ));
2861 IF_DEBUG(linker,debugBelch(" (%p .. %p) ",
2862 ehdrC + shdr[i].sh_offset,
2863 ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1));
2865 if (shdr[i].sh_type == SHT_REL) {
2866 IF_DEBUG(linker,debugBelch("Rel " ));
2867 } else if (shdr[i].sh_type == SHT_RELA) {
2868 IF_DEBUG(linker,debugBelch("RelA " ));
2870 IF_DEBUG(linker,debugBelch(" "));
2873 IF_DEBUG(linker,debugBelch("sname=%s\n", sh_strtab + shdr[i].sh_name ));
2877 IF_DEBUG(linker,debugBelch( "\nString tables" ));
2880 for (i = 0; i < ehdr->e_shnum; i++) {
2881 if (shdr[i].sh_type == SHT_STRTAB
2882 /* Ignore the section header's string table. */
2883 && i != ehdr->e_shstrndx
2884 /* Ignore string tables named .stabstr, as they contain
2886 && 0 != memcmp(".stabstr", sh_strtab + shdr[i].sh_name, 8)
2888 IF_DEBUG(linker,debugBelch(" section %d is a normal string table", i ));
2889 strtab = ehdrC + shdr[i].sh_offset;
2894 errorBelch("%s: no string tables, or too many", oc->fileName);
2899 IF_DEBUG(linker,debugBelch( "\nSymbol tables" ));
2900 for (i = 0; i < ehdr->e_shnum; i++) {
2901 if (shdr[i].sh_type != SHT_SYMTAB) continue;
2902 IF_DEBUG(linker,debugBelch( "section %d is a symbol table\n", i ));
2904 stab = (Elf_Sym*) (ehdrC + shdr[i].sh_offset);
2905 nent = shdr[i].sh_size / sizeof(Elf_Sym);
2906 IF_DEBUG(linker,debugBelch( " number of entries is apparently %d (%ld rem)\n",
2908 (long)shdr[i].sh_size % sizeof(Elf_Sym)
2910 if (0 != shdr[i].sh_size % sizeof(Elf_Sym)) {
2911 errorBelch("%s: non-integral number of symbol table entries", oc->fileName);
2914 for (j = 0; j < nent; j++) {
2915 IF_DEBUG(linker,debugBelch(" %2d ", j ));
2916 IF_DEBUG(linker,debugBelch(" sec=%-5d size=%-3d val=%5p ",
2917 (int)stab[j].st_shndx,
2918 (int)stab[j].st_size,
2919 (char*)stab[j].st_value ));
2921 IF_DEBUG(linker,debugBelch("type=" ));
2922 switch (ELF_ST_TYPE(stab[j].st_info)) {
2923 case STT_NOTYPE: IF_DEBUG(linker,debugBelch("notype " )); break;
2924 case STT_OBJECT: IF_DEBUG(linker,debugBelch("object " )); break;
2925 case STT_FUNC : IF_DEBUG(linker,debugBelch("func " )); break;
2926 case STT_SECTION: IF_DEBUG(linker,debugBelch("section" )); break;
2927 case STT_FILE: IF_DEBUG(linker,debugBelch("file " )); break;
2928 default: IF_DEBUG(linker,debugBelch("? " )); break;
2930 IF_DEBUG(linker,debugBelch(" " ));
2932 IF_DEBUG(linker,debugBelch("bind=" ));
2933 switch (ELF_ST_BIND(stab[j].st_info)) {
2934 case STB_LOCAL : IF_DEBUG(linker,debugBelch("local " )); break;
2935 case STB_GLOBAL: IF_DEBUG(linker,debugBelch("global" )); break;
2936 case STB_WEAK : IF_DEBUG(linker,debugBelch("weak " )); break;
2937 default: IF_DEBUG(linker,debugBelch("? " )); break;
2939 IF_DEBUG(linker,debugBelch(" " ));
2941 IF_DEBUG(linker,debugBelch("name=%s\n", strtab + stab[j].st_name ));
2945 if (nsymtabs == 0) {
2946 errorBelch("%s: didn't find any symbol tables", oc->fileName);
2953 static int getSectionKind_ELF( Elf_Shdr *hdr, int *is_bss )
2957 if (hdr->sh_type == SHT_PROGBITS
2958 && (hdr->sh_flags & SHF_ALLOC) && (hdr->sh_flags & SHF_EXECINSTR)) {
2959 /* .text-style section */
2960 return SECTIONKIND_CODE_OR_RODATA;
2963 if (hdr->sh_type == SHT_PROGBITS
2964 && (hdr->sh_flags & SHF_ALLOC) && (hdr->sh_flags & SHF_WRITE)) {
2965 /* .data-style section */
2966 return SECTIONKIND_RWDATA;
2969 if (hdr->sh_type == SHT_PROGBITS
2970 && (hdr->sh_flags & SHF_ALLOC) && !(hdr->sh_flags & SHF_WRITE)) {
2971 /* .rodata-style section */
2972 return SECTIONKIND_CODE_OR_RODATA;
2975 if (hdr->sh_type == SHT_NOBITS
2976 && (hdr->sh_flags & SHF_ALLOC) && (hdr->sh_flags & SHF_WRITE)) {
2977 /* .bss-style section */
2979 return SECTIONKIND_RWDATA;
2982 return SECTIONKIND_OTHER;
2987 ocGetNames_ELF ( ObjectCode* oc )
2992 char* ehdrC = (char*)(oc->image);
2993 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2994 char* strtab = findElfSection ( ehdrC, SHT_STRTAB );
2995 Elf_Shdr* shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
2997 ASSERT(symhash != NULL);
3000 errorBelch("%s: no strtab", oc->fileName);
3005 for (i = 0; i < ehdr->e_shnum; i++) {
3006 /* Figure out what kind of section it is. Logic derived from
3007 Figure 1.14 ("Special Sections") of the ELF document
3008 ("Portable Formats Specification, Version 1.1"). */
3010 SectionKind kind = getSectionKind_ELF(&shdr[i], &is_bss);
3012 if (is_bss && shdr[i].sh_size > 0) {
3013 /* This is a non-empty .bss section. Allocate zeroed space for
3014 it, and set its .sh_offset field such that
3015 ehdrC + .sh_offset == addr_of_zeroed_space. */
3016 char* zspace = stgCallocBytes(1, shdr[i].sh_size,
3017 "ocGetNames_ELF(BSS)");
3018 shdr[i].sh_offset = ((char*)zspace) - ((char*)ehdrC);
3020 debugBelch("BSS section at 0x%x, size %d\n",
3021 zspace, shdr[i].sh_size);
3025 /* fill in the section info */
3026 if (kind != SECTIONKIND_OTHER && shdr[i].sh_size > 0) {
3027 addProddableBlock(oc, ehdrC + shdr[i].sh_offset, shdr[i].sh_size);
3028 addSection(oc, kind, ehdrC + shdr[i].sh_offset,
3029 ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1);
3032 if (shdr[i].sh_type != SHT_SYMTAB) continue;
3034 /* copy stuff into this module's object symbol table */
3035 stab = (Elf_Sym*) (ehdrC + shdr[i].sh_offset);
3036 nent = shdr[i].sh_size / sizeof(Elf_Sym);
3038 oc->n_symbols = nent;
3039 oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
3040 "ocGetNames_ELF(oc->symbols)");
3042 for (j = 0; j < nent; j++) {
3044 char isLocal = FALSE; /* avoids uninit-var warning */
3046 char* nm = strtab + stab[j].st_name;
3047 int secno = stab[j].st_shndx;
3049 /* Figure out if we want to add it; if so, set ad to its
3050 address. Otherwise leave ad == NULL. */
3052 if (secno == SHN_COMMON) {
3054 ad = stgCallocBytes(1, stab[j].st_size, "ocGetNames_ELF(COMMON)");
3056 debugBelch("COMMON symbol, size %d name %s\n",
3057 stab[j].st_size, nm);
3059 /* Pointless to do addProddableBlock() for this area,
3060 since the linker should never poke around in it. */
3063 if ( ( ELF_ST_BIND(stab[j].st_info)==STB_GLOBAL
3064 || ELF_ST_BIND(stab[j].st_info)==STB_LOCAL
3066 /* and not an undefined symbol */
3067 && stab[j].st_shndx != SHN_UNDEF
3068 /* and not in a "special section" */
3069 && stab[j].st_shndx < SHN_LORESERVE
3071 /* and it's a not a section or string table or anything silly */
3072 ( ELF_ST_TYPE(stab[j].st_info)==STT_FUNC ||
3073 ELF_ST_TYPE(stab[j].st_info)==STT_OBJECT ||
3074 ELF_ST_TYPE(stab[j].st_info)==STT_NOTYPE
3077 /* Section 0 is the undefined section, hence > and not >=. */
3078 ASSERT(secno > 0 && secno < ehdr->e_shnum);
3080 if (shdr[secno].sh_type == SHT_NOBITS) {
3081 debugBelch(" BSS symbol, size %d off %d name %s\n",
3082 stab[j].st_size, stab[j].st_value, nm);
3085 ad = ehdrC + shdr[ secno ].sh_offset + stab[j].st_value;
3086 if (ELF_ST_BIND(stab[j].st_info)==STB_LOCAL) {
3089 #ifdef ELF_FUNCTION_DESC
3090 /* dlsym() and the initialisation table both give us function
3091 * descriptors, so to be consistent we store function descriptors
3092 * in the symbol table */
3093 if (ELF_ST_TYPE(stab[j].st_info) == STT_FUNC)
3094 ad = (char *)allocateFunctionDesc((Elf_Addr)ad);
3096 IF_DEBUG(linker,debugBelch( "addOTabName(GLOB): %10p %s %s",
3097 ad, oc->fileName, nm ));
3102 /* And the decision is ... */
3106 oc->symbols[j] = nm;
3109 /* Ignore entirely. */
3111 ghciInsertStrHashTable(oc->fileName, symhash, nm, ad);
3115 IF_DEBUG(linker,debugBelch( "skipping `%s'\n",
3116 strtab + stab[j].st_name ));
3119 "skipping bind = %d, type = %d, shndx = %d `%s'\n",
3120 (int)ELF_ST_BIND(stab[j].st_info),
3121 (int)ELF_ST_TYPE(stab[j].st_info),
3122 (int)stab[j].st_shndx,
3123 strtab + stab[j].st_name
3126 oc->symbols[j] = NULL;
3135 /* Do ELF relocations which lack an explicit addend. All x86-linux
3136 relocations appear to be of this form. */
3138 do_Elf_Rel_relocations ( ObjectCode* oc, char* ehdrC,
3139 Elf_Shdr* shdr, int shnum,
3140 Elf_Sym* stab, char* strtab )
3145 Elf_Rel* rtab = (Elf_Rel*) (ehdrC + shdr[shnum].sh_offset);
3146 int nent = shdr[shnum].sh_size / sizeof(Elf_Rel);
3147 int target_shndx = shdr[shnum].sh_info;
3148 int symtab_shndx = shdr[shnum].sh_link;
3150 stab = (Elf_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
3151 targ = (Elf_Word*)(ehdrC + shdr[ target_shndx ].sh_offset);
3152 IF_DEBUG(linker,debugBelch( "relocations for section %d using symtab %d\n",
3153 target_shndx, symtab_shndx ));
3155 /* Skip sections that we're not interested in. */
3158 SectionKind kind = getSectionKind_ELF(&shdr[target_shndx], &is_bss);
3159 if (kind == SECTIONKIND_OTHER) {
3160 IF_DEBUG(linker,debugBelch( "skipping (target section not loaded)"));
3165 for (j = 0; j < nent; j++) {
3166 Elf_Addr offset = rtab[j].r_offset;
3167 Elf_Addr info = rtab[j].r_info;
3169 Elf_Addr P = ((Elf_Addr)targ) + offset;
3170 Elf_Word* pP = (Elf_Word*)P;
3175 StgStablePtr stablePtr;
3178 IF_DEBUG(linker,debugBelch( "Rel entry %3d is raw(%6p %6p)",
3179 j, (void*)offset, (void*)info ));
3181 IF_DEBUG(linker,debugBelch( " ZERO" ));
3184 Elf_Sym sym = stab[ELF_R_SYM(info)];
3185 /* First see if it is a local symbol. */
3186 if (ELF_ST_BIND(sym.st_info) == STB_LOCAL) {
3187 /* Yes, so we can get the address directly from the ELF symbol
3189 symbol = sym.st_name==0 ? "(noname)" : strtab+sym.st_name;
3191 (ehdrC + shdr[ sym.st_shndx ].sh_offset
3192 + stab[ELF_R_SYM(info)].st_value);
3195 symbol = strtab + sym.st_name;
3196 stablePtr = (StgStablePtr)lookupHashTable(stablehash, (StgWord)symbol);
3197 if (NULL == stablePtr) {
3198 /* No, so look up the name in our global table. */
3199 S_tmp = lookupSymbol( symbol );
3200 S = (Elf_Addr)S_tmp;
3202 stableVal = deRefStablePtr( stablePtr );
3204 S = (Elf_Addr)S_tmp;
3208 errorBelch("%s: unknown symbol `%s'", oc->fileName, symbol);
3211 IF_DEBUG(linker,debugBelch( "`%s' resolves to %p\n", symbol, (void*)S ));
3214 IF_DEBUG(linker,debugBelch( "Reloc: P = %p S = %p A = %p\n",
3215 (void*)P, (void*)S, (void*)A ));
3216 checkProddableBlock ( oc, pP );
3220 switch (ELF_R_TYPE(info)) {
3221 # ifdef i386_HOST_ARCH
3222 case R_386_32: *pP = value; break;
3223 case R_386_PC32: *pP = value - P; break;
3226 errorBelch("%s: unhandled ELF relocation(Rel) type %lu\n",
3227 oc->fileName, (lnat)ELF_R_TYPE(info));
3235 /* Do ELF relocations for which explicit addends are supplied.
3236 sparc-solaris relocations appear to be of this form. */
3238 do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
3239 Elf_Shdr* shdr, int shnum,
3240 Elf_Sym* stab, char* strtab )
3243 char *symbol = NULL;
3245 Elf_Rela* rtab = (Elf_Rela*) (ehdrC + shdr[shnum].sh_offset);
3246 int nent = shdr[shnum].sh_size / sizeof(Elf_Rela);
3247 int target_shndx = shdr[shnum].sh_info;
3248 int symtab_shndx = shdr[shnum].sh_link;
3250 stab = (Elf_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
3251 targ = (Elf_Addr) (ehdrC + shdr[ target_shndx ].sh_offset);
3252 IF_DEBUG(linker,debugBelch( "relocations for section %d using symtab %d\n",
3253 target_shndx, symtab_shndx ));
3255 for (j = 0; j < nent; j++) {
3256 #if defined(DEBUG) || defined(sparc_HOST_ARCH) || defined(ia64_HOST_ARCH) || defined(powerpc_HOST_ARCH) || defined(x86_64_HOST_ARCH)
3257 /* This #ifdef only serves to avoid unused-var warnings. */
3258 Elf_Addr offset = rtab[j].r_offset;
3259 Elf_Addr P = targ + offset;
3261 Elf_Addr info = rtab[j].r_info;
3262 Elf_Addr A = rtab[j].r_addend;
3266 # if defined(sparc_HOST_ARCH)
3267 Elf_Word* pP = (Elf_Word*)P;
3269 # elif defined(ia64_HOST_ARCH)
3270 Elf64_Xword *pP = (Elf64_Xword *)P;
3272 # elif defined(powerpc_HOST_ARCH)
3276 IF_DEBUG(linker,debugBelch( "Rel entry %3d is raw(%6p %6p %6p) ",
3277 j, (void*)offset, (void*)info,
3280 IF_DEBUG(linker,debugBelch( " ZERO" ));
3283 Elf_Sym sym = stab[ELF_R_SYM(info)];
3284 /* First see if it is a local symbol. */
3285 if (ELF_ST_BIND(sym.st_info) == STB_LOCAL) {
3286 /* Yes, so we can get the address directly from the ELF symbol
3288 symbol = sym.st_name==0 ? "(noname)" : strtab+sym.st_name;
3290 (ehdrC + shdr[ sym.st_shndx ].sh_offset
3291 + stab[ELF_R_SYM(info)].st_value);
3292 #ifdef ELF_FUNCTION_DESC
3293 /* Make a function descriptor for this function */
3294 if (S && ELF_ST_TYPE(sym.st_info) == STT_FUNC) {
3295 S = allocateFunctionDesc(S + A);
3300 /* No, so look up the name in our global table. */
3301 symbol = strtab + sym.st_name;
3302 S_tmp = lookupSymbol( symbol );
3303 S = (Elf_Addr)S_tmp;
3305 #ifdef ELF_FUNCTION_DESC
3306 /* If a function, already a function descriptor - we would
3307 have to copy it to add an offset. */
3308 if (S && (ELF_ST_TYPE(sym.st_info) == STT_FUNC) && (A != 0))
3309 errorBelch("%s: function %s with addend %p", oc->fileName, symbol, (void *)A);
3313 errorBelch("%s: unknown symbol `%s'", oc->fileName, symbol);
3316 IF_DEBUG(linker,debugBelch( "`%s' resolves to %p", symbol, (void*)S ));
3319 IF_DEBUG(linker,debugBelch("Reloc: P = %p S = %p A = %p\n",
3320 (void*)P, (void*)S, (void*)A ));
3321 /* checkProddableBlock ( oc, (void*)P ); */
3325 switch (ELF_R_TYPE(info)) {
3326 # if defined(sparc_HOST_ARCH)
3327 case R_SPARC_WDISP30:
3328 w1 = *pP & 0xC0000000;
3329 w2 = (Elf_Word)((value - P) >> 2);
3330 ASSERT((w2 & 0xC0000000) == 0);
3335 w1 = *pP & 0xFFC00000;
3336 w2 = (Elf_Word)(value >> 10);
3337 ASSERT((w2 & 0xFFC00000) == 0);
3343 w2 = (Elf_Word)(value & 0x3FF);
3344 ASSERT((w2 & ~0x3FF) == 0);
3348 /* According to the Sun documentation:
3350 This relocation type resembles R_SPARC_32, except it refers to an
3351 unaligned word. That is, the word to be relocated must be treated
3352 as four separate bytes with arbitrary alignment, not as a word
3353 aligned according to the architecture requirements.
3355 (JRS: which means that freeloading on the R_SPARC_32 case
3356 is probably wrong, but hey ...)
3360 w2 = (Elf_Word)value;
3363 # elif defined(ia64_HOST_ARCH)
3364 case R_IA64_DIR64LSB:
3365 case R_IA64_FPTR64LSB:
3368 case R_IA64_PCREL64LSB:
3371 case R_IA64_SEGREL64LSB:
3372 addr = findElfSegment(ehdrC, value);
3375 case R_IA64_GPREL22:
3376 ia64_reloc_gprel22(P, value);
3378 case R_IA64_LTOFF22:
3379 case R_IA64_LTOFF22X:
3380 case R_IA64_LTOFF_FPTR22:
3381 addr = allocateGOTEntry(value);
3382 ia64_reloc_gprel22(P, addr);
3384 case R_IA64_PCREL21B:
3385 ia64_reloc_pcrel21(P, S, oc);
3388 /* This goes with R_IA64_LTOFF22X and points to the load to
3389 * convert into a move. We don't implement relaxation. */
3391 # elif defined(powerpc_HOST_ARCH)
3392 case R_PPC_ADDR16_LO:
3393 *(Elf32_Half*) P = value;
3396 case R_PPC_ADDR16_HI:
3397 *(Elf32_Half*) P = value >> 16;
3400 case R_PPC_ADDR16_HA:
3401 *(Elf32_Half*) P = (value + 0x8000) >> 16;
3405 *(Elf32_Word *) P = value;
3409 *(Elf32_Word *) P = value - P;
3415 if( delta << 6 >> 6 != delta )
3417 value = makeJumpIsland( oc, ELF_R_SYM(info), value );
3420 if( value == 0 || delta << 6 >> 6 != delta )
3422 barf( "Unable to make ppcJumpIsland for #%d",
3428 *(Elf_Word *) P = (*(Elf_Word *) P & 0xfc000003)
3429 | (delta & 0x3fffffc);
3433 #if x86_64_HOST_ARCH
3435 *(Elf64_Xword *)P = value;
3440 StgInt64 off = value - P;
3441 if (off >= 0x7fffffffL || off < -0x80000000L) {
3442 barf("R_X86_64_PC32 relocation out of range: %s = %p",
3445 *(Elf64_Word *)P = (Elf64_Word)off;
3450 if (value >= 0x7fffffffL) {
3451 barf("R_X86_64_32 relocation out of range: %s = %p\n",
3454 *(Elf64_Word *)P = (Elf64_Word)value;
3458 if ((StgInt64)value > 0x7fffffffL || (StgInt64)value < -0x80000000L) {
3459 barf("R_X86_64_32S relocation out of range: %s = %p\n",
3462 *(Elf64_Sword *)P = (Elf64_Sword)value;
3467 errorBelch("%s: unhandled ELF relocation(RelA) type %lu\n",
3468 oc->fileName, (lnat)ELF_R_TYPE(info));
3477 ocResolve_ELF ( ObjectCode* oc )
3481 Elf_Sym* stab = NULL;
3482 char* ehdrC = (char*)(oc->image);
3483 Elf_Ehdr* ehdr = (Elf_Ehdr*) ehdrC;
3484 Elf_Shdr* shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
3486 /* first find "the" symbol table */
3487 stab = (Elf_Sym*) findElfSection ( ehdrC, SHT_SYMTAB );
3489 /* also go find the string table */
3490 strtab = findElfSection ( ehdrC, SHT_STRTAB );
3492 if (stab == NULL || strtab == NULL) {
3493 errorBelch("%s: can't find string or symbol table", oc->fileName);
3497 /* Process the relocation sections. */
3498 for (shnum = 0; shnum < ehdr->e_shnum; shnum++) {
3499 if (shdr[shnum].sh_type == SHT_REL) {
3500 ok = do_Elf_Rel_relocations ( oc, ehdrC, shdr,
3501 shnum, stab, strtab );
3505 if (shdr[shnum].sh_type == SHT_RELA) {
3506 ok = do_Elf_Rela_relocations ( oc, ehdrC, shdr,
3507 shnum, stab, strtab );
3512 /* Free the local symbol table; we won't need it again. */
3513 freeHashTable(oc->lochash, NULL);
3516 #if defined(powerpc_HOST_ARCH)
3517 ocFlushInstructionCache( oc );
3525 * Instructions are 41 bits long, packed into 128 bit bundles with a 5-bit template
3526 * at the front. The following utility functions pack and unpack instructions, and
3527 * take care of the most common relocations.
3530 #ifdef ia64_HOST_ARCH
3533 ia64_extract_instruction(Elf64_Xword *target)
3536 int slot = (Elf_Addr)target & 3;
3537 target = (Elf_Addr)target & ~3;
3545 return ((w1 >> 5) & 0x1ffffffffff);
3547 return (w1 >> 46) | ((w2 & 0x7fffff) << 18);
3551 barf("ia64_extract_instruction: invalid slot %p", target);
3556 ia64_deposit_instruction(Elf64_Xword *target, Elf64_Xword value)
3558 int slot = (Elf_Addr)target & 3;
3559 target = (Elf_Addr)target & ~3;
3564 *target |= value << 5;
3567 *target |= value << 46;
3568 *(target+1) |= value >> 18;
3571 *(target+1) |= value << 23;
3577 ia64_reloc_gprel22(Elf_Addr target, Elf_Addr value)
3579 Elf64_Xword instruction;
3580 Elf64_Sxword rel_value;
3582 rel_value = value - gp_val;
3583 if ((rel_value > 0x1fffff) || (rel_value < -0x1fffff))
3584 barf("GP-relative data out of range (address = 0x%lx, gp = 0x%lx)", value, gp_val);
3586 instruction = ia64_extract_instruction((Elf64_Xword *)target);
3587 instruction |= (((rel_value >> 0) & 0x07f) << 13) /* imm7b */
3588 | (((rel_value >> 7) & 0x1ff) << 27) /* imm9d */
3589 | (((rel_value >> 16) & 0x01f) << 22) /* imm5c */
3590 | ((Elf64_Xword)(rel_value < 0) << 36); /* s */
3591 ia64_deposit_instruction((Elf64_Xword *)target, instruction);
3595 ia64_reloc_pcrel21(Elf_Addr target, Elf_Addr value, ObjectCode *oc)
3597 Elf64_Xword instruction;
3598 Elf64_Sxword rel_value;
3601 entry = allocatePLTEntry(value, oc);
3603 rel_value = (entry >> 4) - (target >> 4);
3604 if ((rel_value > 0xfffff) || (rel_value < -0xfffff))
3605 barf("PLT entry too far away (entry = 0x%lx, target = 0x%lx)", entry, target);
3607 instruction = ia64_extract_instruction((Elf64_Xword *)target);
3608 instruction |= ((rel_value & 0xfffff) << 13) /* imm20b */
3609 | ((Elf64_Xword)(rel_value < 0) << 36); /* s */
3610 ia64_deposit_instruction((Elf64_Xword *)target, instruction);
3616 * PowerPC ELF specifics
3619 #ifdef powerpc_HOST_ARCH
3621 static int ocAllocateJumpIslands_ELF( ObjectCode *oc )
3627 ehdr = (Elf_Ehdr *) oc->image;
3628 shdr = (Elf_Shdr *) ( ((char *)oc->image) + ehdr->e_shoff );
3630 for( i = 0; i < ehdr->e_shnum; i++ )
3631 if( shdr[i].sh_type == SHT_SYMTAB )
3634 if( i == ehdr->e_shnum )
3636 errorBelch( "This ELF file contains no symtab" );
3640 if( shdr[i].sh_entsize != sizeof( Elf_Sym ) )
3642 errorBelch( "The entry size (%d) of the symtab isn't %d\n",
3643 shdr[i].sh_entsize, sizeof( Elf_Sym ) );
3648 return ocAllocateJumpIslands( oc, shdr[i].sh_size / sizeof( Elf_Sym ), 0 );
3651 #endif /* powerpc */
3655 /* --------------------------------------------------------------------------
3657 * ------------------------------------------------------------------------*/
3659 #if defined(OBJFORMAT_MACHO)
3662 Support for MachO linking on Darwin/MacOS X
3663 by Wolfgang Thaller (wolfgang.thaller@gmx.net)
3665 I hereby formally apologize for the hackish nature of this code.
3666 Things that need to be done:
3667 *) implement ocVerifyImage_MachO
3668 *) add still more sanity checks.
3671 #ifdef powerpc_HOST_ARCH
3672 static int ocAllocateJumpIslands_MachO(ObjectCode* oc)
3674 struct mach_header *header = (struct mach_header *) oc->image;
3675 struct load_command *lc = (struct load_command *) (header + 1);
3678 for( i = 0; i < header->ncmds; i++ )
3680 if( lc->cmd == LC_SYMTAB )
3682 // Find out the first and last undefined external
3683 // symbol, so we don't have to allocate too many
3685 struct symtab_command *symLC = (struct symtab_command *) lc;
3686 unsigned min = symLC->nsyms, max = 0;
3687 struct nlist *nlist =
3688 symLC ? (struct nlist*) ((char*) oc->image + symLC->symoff)
3690 for(i=0;i<symLC->nsyms;i++)
3692 if(nlist[i].n_type & N_STAB)
3694 else if(nlist[i].n_type & N_EXT)
3696 if((nlist[i].n_type & N_TYPE) == N_UNDF
3697 && (nlist[i].n_value == 0))
3707 return ocAllocateJumpIslands(oc, max - min + 1, min);
3712 lc = (struct load_command *) ( ((char *)lc) + lc->cmdsize );
3714 return ocAllocateJumpIslands(oc,0,0);
3718 static int ocVerifyImage_MachO(ObjectCode* oc STG_UNUSED)
3720 // FIXME: do some verifying here
3724 static int resolveImports(
3727 struct symtab_command *symLC,
3728 struct section *sect, // ptr to lazy or non-lazy symbol pointer section
3729 unsigned long *indirectSyms,
3730 struct nlist *nlist)
3733 size_t itemSize = 4;
3736 int isJumpTable = 0;
3737 if(!strcmp(sect->sectname,"__jump_table"))
3741 ASSERT(sect->reserved2 == itemSize);
3745 for(i=0; i*itemSize < sect->size;i++)
3747 // according to otool, reserved1 contains the first index into the indirect symbol table
3748 struct nlist *symbol = &nlist[indirectSyms[sect->reserved1+i]];
3749 char *nm = image + symLC->stroff + symbol->n_un.n_strx;
3752 if((symbol->n_type & N_TYPE) == N_UNDF
3753 && (symbol->n_type & N_EXT) && (symbol->n_value != 0))
3754 addr = (void*) (symbol->n_value);
3755 else if((addr = lookupLocalSymbol(oc,nm)) != NULL)
3758 addr = lookupSymbol(nm);
3761 errorBelch("\n%s: unknown symbol `%s'", oc->fileName, nm);
3769 checkProddableBlock(oc,image + sect->offset + i*itemSize);
3770 *(image + sect->offset + i*itemSize) = 0xe9; // jmp
3771 *(unsigned*)(image + sect->offset + i*itemSize + 1)
3772 = (char*)addr - (image + sect->offset + i*itemSize + 5);
3777 checkProddableBlock(oc,((void**)(image + sect->offset)) + i);
3778 ((void**)(image + sect->offset))[i] = addr;
3785 static unsigned long relocateAddress(
3788 struct section* sections,
3789 unsigned long address)
3792 for(i = 0; i < nSections; i++)
3794 if(sections[i].addr <= address
3795 && address < sections[i].addr + sections[i].size)
3797 return (unsigned long)oc->image
3798 + sections[i].offset + address - sections[i].addr;
3801 barf("Invalid Mach-O file:"
3802 "Address out of bounds while relocating object file");
3806 static int relocateSection(
3809 struct symtab_command *symLC, struct nlist *nlist,
3810 int nSections, struct section* sections, struct section *sect)
3812 struct relocation_info *relocs;
3815 if(!strcmp(sect->sectname,"__la_symbol_ptr"))
3817 else if(!strcmp(sect->sectname,"__nl_symbol_ptr"))
3819 else if(!strcmp(sect->sectname,"__la_sym_ptr2"))
3821 else if(!strcmp(sect->sectname,"__la_sym_ptr3"))
3825 relocs = (struct relocation_info*) (image + sect->reloff);
3829 if(relocs[i].r_address & R_SCATTERED)
3831 struct scattered_relocation_info *scat =
3832 (struct scattered_relocation_info*) &relocs[i];
3836 if(scat->r_length == 2)
3838 unsigned long word = 0;
3839 unsigned long* wordPtr = (unsigned long*) (image + sect->offset + scat->r_address);
3840 checkProddableBlock(oc,wordPtr);
3842 // Note on relocation types:
3843 // i386 uses the GENERIC_RELOC_* types,
3844 // while ppc uses special PPC_RELOC_* types.
3845 // *_RELOC_VANILLA and *_RELOC_PAIR have the same value
3846 // in both cases, all others are different.
3847 // Therefore, we use GENERIC_RELOC_VANILLA
3848 // and GENERIC_RELOC_PAIR instead of the PPC variants,
3849 // and use #ifdefs for the other types.
3851 // Step 1: Figure out what the relocated value should be
3852 if(scat->r_type == GENERIC_RELOC_VANILLA)
3854 word = *wordPtr + (unsigned long) relocateAddress(
3861 #ifdef powerpc_HOST_ARCH
3862 else if(scat->r_type == PPC_RELOC_SECTDIFF
3863 || scat->r_type == PPC_RELOC_LO16_SECTDIFF
3864 || scat->r_type == PPC_RELOC_HI16_SECTDIFF
3865 || scat->r_type == PPC_RELOC_HA16_SECTDIFF)
3867 else if(scat->r_type == GENERIC_RELOC_SECTDIFF)
3870 struct scattered_relocation_info *pair =
3871 (struct scattered_relocation_info*) &relocs[i+1];
3873 if(!pair->r_scattered || pair->r_type != GENERIC_RELOC_PAIR)
3874 barf("Invalid Mach-O file: "
3875 "RELOC_*_SECTDIFF not followed by RELOC_PAIR");
3877 word = (unsigned long)
3878 (relocateAddress(oc, nSections, sections, scat->r_value)
3879 - relocateAddress(oc, nSections, sections, pair->r_value));
3882 #ifdef powerpc_HOST_ARCH
3883 else if(scat->r_type == PPC_RELOC_HI16
3884 || scat->r_type == PPC_RELOC_LO16
3885 || scat->r_type == PPC_RELOC_HA16
3886 || scat->r_type == PPC_RELOC_LO14)
3887 { // these are generated by label+offset things
3888 struct relocation_info *pair = &relocs[i+1];
3889 if((pair->r_address & R_SCATTERED) || pair->r_type != PPC_RELOC_PAIR)
3890 barf("Invalid Mach-O file: "
3891 "PPC_RELOC_* not followed by PPC_RELOC_PAIR");
3893 if(scat->r_type == PPC_RELOC_LO16)
3895 word = ((unsigned short*) wordPtr)[1];
3896 word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF) << 16;
3898 else if(scat->r_type == PPC_RELOC_LO14)
3900 barf("Unsupported Relocation: PPC_RELOC_LO14");
3901 word = ((unsigned short*) wordPtr)[1] & 0xFFFC;
3902 word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF) << 16;
3904 else if(scat->r_type == PPC_RELOC_HI16)
3906 word = ((unsigned short*) wordPtr)[1] << 16;
3907 word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF);
3909 else if(scat->r_type == PPC_RELOC_HA16)
3911 word = ((unsigned short*) wordPtr)[1] << 16;
3912 word += ((short)relocs[i+1].r_address & (short)0xFFFF);
3916 word += (unsigned long) relocateAddress(oc, nSections, sections, scat->r_value)
3923 continue; // ignore the others
3925 #ifdef powerpc_HOST_ARCH
3926 if(scat->r_type == GENERIC_RELOC_VANILLA
3927 || scat->r_type == PPC_RELOC_SECTDIFF)
3929 if(scat->r_type == GENERIC_RELOC_VANILLA
3930 || scat->r_type == GENERIC_RELOC_SECTDIFF)
3935 #ifdef powerpc_HOST_ARCH
3936 else if(scat->r_type == PPC_RELOC_LO16_SECTDIFF || scat->r_type == PPC_RELOC_LO16)
3938 ((unsigned short*) wordPtr)[1] = word & 0xFFFF;
3940 else if(scat->r_type == PPC_RELOC_HI16_SECTDIFF || scat->r_type == PPC_RELOC_HI16)
3942 ((unsigned short*) wordPtr)[1] = (word >> 16) & 0xFFFF;
3944 else if(scat->r_type == PPC_RELOC_HA16_SECTDIFF || scat->r_type == PPC_RELOC_HA16)
3946 ((unsigned short*) wordPtr)[1] = ((word >> 16) & 0xFFFF)
3947 + ((word & (1<<15)) ? 1 : 0);
3953 continue; // FIXME: I hope it's OK to ignore all the others.
3957 struct relocation_info *reloc = &relocs[i];
3958 if(reloc->r_pcrel && !reloc->r_extern)
3961 if(reloc->r_length == 2)
3963 unsigned long word = 0;
3964 #ifdef powerpc_HOST_ARCH
3965 unsigned long jumpIsland = 0;
3966 long offsetToJumpIsland = 0xBADBAD42; // initialise to bad value
3967 // to avoid warning and to catch
3971 unsigned long* wordPtr = (unsigned long*) (image + sect->offset + reloc->r_address);
3972 checkProddableBlock(oc,wordPtr);
3974 if(reloc->r_type == GENERIC_RELOC_VANILLA)
3978 #ifdef powerpc_HOST_ARCH
3979 else if(reloc->r_type == PPC_RELOC_LO16)
3981 word = ((unsigned short*) wordPtr)[1];
3982 word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF) << 16;
3984 else if(reloc->r_type == PPC_RELOC_HI16)
3986 word = ((unsigned short*) wordPtr)[1] << 16;
3987 word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF);
3989 else if(reloc->r_type == PPC_RELOC_HA16)
3991 word = ((unsigned short*) wordPtr)[1] << 16;
3992 word += ((short)relocs[i+1].r_address & (short)0xFFFF);
3994 else if(reloc->r_type == PPC_RELOC_BR24)
3997 word = (word & 0x03FFFFFC) | ((word & 0x02000000) ? 0xFC000000 : 0);
4001 if(!reloc->r_extern)
4004 sections[reloc->r_symbolnum-1].offset
4005 - sections[reloc->r_symbolnum-1].addr
4012 struct nlist *symbol = &nlist[reloc->r_symbolnum];
4013 char *nm = image + symLC->stroff + symbol->n_un.n_strx;
4014 void *symbolAddress = lookupSymbol(nm);
4017 errorBelch("\nunknown symbol `%s'", nm);
4023 #ifdef powerpc_HOST_ARCH
4024 // In the .o file, this should be a relative jump to NULL
4025 // and we'll change it to a relative jump to the symbol
4026 ASSERT(-word == reloc->r_address);
4027 jumpIsland = makeJumpIsland(oc,reloc->r_symbolnum,(unsigned long) symbolAddress);
4030 offsetToJumpIsland = word + jumpIsland
4031 - (((long)image) + sect->offset - sect->addr);
4034 word += (unsigned long) symbolAddress
4035 - (((long)image) + sect->offset - sect->addr);
4039 word += (unsigned long) symbolAddress;
4043 if(reloc->r_type == GENERIC_RELOC_VANILLA)
4048 #ifdef powerpc_HOST_ARCH
4049 else if(reloc->r_type == PPC_RELOC_LO16)
4051 ((unsigned short*) wordPtr)[1] = word & 0xFFFF;
4054 else if(reloc->r_type == PPC_RELOC_HI16)
4056 ((unsigned short*) wordPtr)[1] = (word >> 16) & 0xFFFF;
4059 else if(reloc->r_type == PPC_RELOC_HA16)
4061 ((unsigned short*) wordPtr)[1] = ((word >> 16) & 0xFFFF)
4062 + ((word & (1<<15)) ? 1 : 0);
4065 else if(reloc->r_type == PPC_RELOC_BR24)
4067 if((long)word > (long)0x01FFFFFF || (long)word < (long)0xFFE00000)
4069 // The branch offset is too large.
4070 // Therefore, we try to use a jump island.
4073 barf("unconditional relative branch out of range: "
4074 "no jump island available");
4077 word = offsetToJumpIsland;
4078 if((long)word > (long)0x01FFFFFF || (long)word < (long)0xFFE00000)
4079 barf("unconditional relative branch out of range: "
4080 "jump island out of range");
4082 *wordPtr = (*wordPtr & 0xFC000003) | (word & 0x03FFFFFC);
4087 barf("\nunknown relocation %d",reloc->r_type);
4094 static int ocGetNames_MachO(ObjectCode* oc)
4096 char *image = (char*) oc->image;
4097 struct mach_header *header = (struct mach_header*) image;
4098 struct load_command *lc = (struct load_command*) (image + sizeof(struct mach_header));
4099 unsigned i,curSymbol = 0;
4100 struct segment_command *segLC = NULL;
4101 struct section *sections;
4102 struct symtab_command *symLC = NULL;
4103 struct nlist *nlist;
4104 unsigned long commonSize = 0;
4105 char *commonStorage = NULL;
4106 unsigned long commonCounter;
4108 for(i=0;i<header->ncmds;i++)
4110 if(lc->cmd == LC_SEGMENT)
4111 segLC = (struct segment_command*) lc;
4112 else if(lc->cmd == LC_SYMTAB)
4113 symLC = (struct symtab_command*) lc;
4114 lc = (struct load_command *) ( ((char*)lc) + lc->cmdsize );
4117 sections = (struct section*) (segLC+1);
4118 nlist = symLC ? (struct nlist*) (image + symLC->symoff)
4121 for(i=0;i<segLC->nsects;i++)
4123 if(sections[i].size == 0)
4126 if((sections[i].flags & SECTION_TYPE) == S_ZEROFILL)
4128 char * zeroFillArea = stgCallocBytes(1,sections[i].size,
4129 "ocGetNames_MachO(common symbols)");
4130 sections[i].offset = zeroFillArea - image;
4133 if(!strcmp(sections[i].sectname,"__text"))
4134 addSection(oc, SECTIONKIND_CODE_OR_RODATA,
4135 (void*) (image + sections[i].offset),
4136 (void*) (image + sections[i].offset + sections[i].size));
4137 else if(!strcmp(sections[i].sectname,"__const"))
4138 addSection(oc, SECTIONKIND_RWDATA,
4139 (void*) (image + sections[i].offset),
4140 (void*) (image + sections[i].offset + sections[i].size));
4141 else if(!strcmp(sections[i].sectname,"__data"))
4142 addSection(oc, SECTIONKIND_RWDATA,
4143 (void*) (image + sections[i].offset),
4144 (void*) (image + sections[i].offset + sections[i].size));
4145 else if(!strcmp(sections[i].sectname,"__bss")
4146 || !strcmp(sections[i].sectname,"__common"))
4147 addSection(oc, SECTIONKIND_RWDATA,
4148 (void*) (image + sections[i].offset),
4149 (void*) (image + sections[i].offset + sections[i].size));
4151 addProddableBlock(oc, (void*) (image + sections[i].offset),
4155 // count external symbols defined here
4159 for(i=0;i<symLC->nsyms;i++)
4161 if(nlist[i].n_type & N_STAB)
4163 else if(nlist[i].n_type & N_EXT)
4165 if((nlist[i].n_type & N_TYPE) == N_UNDF
4166 && (nlist[i].n_value != 0))
4168 commonSize += nlist[i].n_value;
4171 else if((nlist[i].n_type & N_TYPE) == N_SECT)
4176 oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
4177 "ocGetNames_MachO(oc->symbols)");
4181 for(i=0;i<symLC->nsyms;i++)
4183 if(nlist[i].n_type & N_STAB)
4185 else if((nlist[i].n_type & N_TYPE) == N_SECT)
4187 if(nlist[i].n_type & N_EXT)
4189 char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
4190 ghciInsertStrHashTable(oc->fileName, symhash, nm,
4192 + sections[nlist[i].n_sect-1].offset
4193 - sections[nlist[i].n_sect-1].addr
4194 + nlist[i].n_value);
4195 oc->symbols[curSymbol++] = nm;
4199 char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
4200 ghciInsertStrHashTable(oc->fileName, oc->lochash, nm,
4202 + sections[nlist[i].n_sect-1].offset
4203 - sections[nlist[i].n_sect-1].addr
4204 + nlist[i].n_value);
4210 commonStorage = stgCallocBytes(1,commonSize,"ocGetNames_MachO(common symbols)");
4211 commonCounter = (unsigned long)commonStorage;
4214 for(i=0;i<symLC->nsyms;i++)
4216 if((nlist[i].n_type & N_TYPE) == N_UNDF
4217 && (nlist[i].n_type & N_EXT) && (nlist[i].n_value != 0))
4219 char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
4220 unsigned long sz = nlist[i].n_value;
4222 nlist[i].n_value = commonCounter;
4224 ghciInsertStrHashTable(oc->fileName, symhash, nm,
4225 (void*)commonCounter);
4226 oc->symbols[curSymbol++] = nm;
4228 commonCounter += sz;
4235 static int ocResolve_MachO(ObjectCode* oc)
4237 char *image = (char*) oc->image;
4238 struct mach_header *header = (struct mach_header*) image;
4239 struct load_command *lc = (struct load_command*) (image + sizeof(struct mach_header));
4241 struct segment_command *segLC = NULL;
4242 struct section *sections;
4243 struct symtab_command *symLC = NULL;
4244 struct dysymtab_command *dsymLC = NULL;
4245 struct nlist *nlist;
4247 for(i=0;i<header->ncmds;i++)
4249 if(lc->cmd == LC_SEGMENT)
4250 segLC = (struct segment_command*) lc;
4251 else if(lc->cmd == LC_SYMTAB)
4252 symLC = (struct symtab_command*) lc;
4253 else if(lc->cmd == LC_DYSYMTAB)
4254 dsymLC = (struct dysymtab_command*) lc;
4255 lc = (struct load_command *) ( ((char*)lc) + lc->cmdsize );
4258 sections = (struct section*) (segLC+1);
4259 nlist = symLC ? (struct nlist*) (image + symLC->symoff)
4264 unsigned long *indirectSyms
4265 = (unsigned long*) (image + dsymLC->indirectsymoff);
4267 for(i=0;i<segLC->nsects;i++)
4269 if( !strcmp(sections[i].sectname,"__la_symbol_ptr")
4270 || !strcmp(sections[i].sectname,"__la_sym_ptr2")
4271 || !strcmp(sections[i].sectname,"__la_sym_ptr3"))
4273 if(!resolveImports(oc,image,symLC,§ions[i],indirectSyms,nlist))
4276 else if(!strcmp(sections[i].sectname,"__nl_symbol_ptr")
4277 || !strcmp(sections[i].sectname,"__pointers"))
4279 if(!resolveImports(oc,image,symLC,§ions[i],indirectSyms,nlist))
4282 else if(!strcmp(sections[i].sectname,"__jump_table"))
4284 if(!resolveImports(oc,image,symLC,§ions[i],indirectSyms,nlist))
4290 for(i=0;i<segLC->nsects;i++)
4292 if(!relocateSection(oc,image,symLC,nlist,segLC->nsects,sections,§ions[i]))
4296 /* Free the local symbol table; we won't need it again. */
4297 freeHashTable(oc->lochash, NULL);
4300 #if defined (powerpc_HOST_ARCH)
4301 ocFlushInstructionCache( oc );
4307 #ifdef powerpc_HOST_ARCH
4309 * The Mach-O object format uses leading underscores. But not everywhere.
4310 * There is a small number of runtime support functions defined in
4311 * libcc_dynamic.a whose name does not have a leading underscore.
4312 * As a consequence, we can't get their address from C code.
4313 * We have to use inline assembler just to take the address of a function.
4317 static void machoInitSymbolsWithoutUnderscore()
4319 extern void* symbolsWithoutUnderscore[];
4320 void **p = symbolsWithoutUnderscore;
4321 __asm__ volatile(".globl _symbolsWithoutUnderscore\n.data\n_symbolsWithoutUnderscore:");
4325 __asm__ volatile(".long " # x);
4327 RTS_MACHO_NOUNDERLINE_SYMBOLS
4329 __asm__ volatile(".text");
4333 ghciInsertStrHashTable("(GHCi built-in symbols)", symhash, #x, *p++);
4335 RTS_MACHO_NOUNDERLINE_SYMBOLS
4342 * Figure out by how much to shift the entire Mach-O file in memory
4343 * when loading so that its single segment ends up 16-byte-aligned
4345 static int machoGetMisalignment( FILE * f )
4347 struct mach_header header;
4350 fread(&header, sizeof(header), 1, f);
4353 if(header.magic != MH_MAGIC)
4356 misalignment = (header.sizeofcmds + sizeof(header))
4359 return misalignment ? (16 - misalignment) : 0;