1 /* -----------------------------------------------------------------------------
2 * $Id: Linker.c,v 1.131 2003/09/24 11:06:53 simonmar Exp $
4 * (c) The GHC Team, 2000-2003
8 * ---------------------------------------------------------------------------*/
11 #include "PosixSource.h"
18 #include "LinkerInternals.h"
20 #include "StoragePriv.h"
23 #ifdef HAVE_SYS_TYPES_H
24 #include <sys/types.h>
30 #ifdef HAVE_SYS_STAT_H
34 #if defined(HAVE_FRAMEWORK_HASKELLSUPPORT)
35 #include <HaskellSupport/dlfcn.h>
36 #elif defined(HAVE_DLFCN_H)
40 #if defined(cygwin32_TARGET_OS)
45 #ifdef HAVE_SYS_TIME_H
49 #include <sys/fcntl.h>
50 #include <sys/termios.h>
51 #include <sys/utime.h>
52 #include <sys/utsname.h>
56 #if defined(ia64_TARGET_ARCH)
62 #if defined(linux_TARGET_OS) || defined(solaris2_TARGET_OS) || defined(freebsd_TARGET_OS) || defined(netbsd_TARGET_OS) || defined(openbsd_TARGET_OS)
63 # define OBJFORMAT_ELF
64 #elif defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS)
65 # define OBJFORMAT_PEi386
68 #elif defined(darwin_TARGET_OS)
69 # include <mach-o/ppc/reloc.h>
70 # define OBJFORMAT_MACHO
71 # include <mach-o/loader.h>
72 # include <mach-o/nlist.h>
73 # include <mach-o/reloc.h>
74 # include <mach-o/dyld.h>
77 /* Hash table mapping symbol names to Symbol */
78 static /*Str*/HashTable *symhash;
80 /* List of currently loaded objects */
81 ObjectCode *objects = NULL; /* initially empty */
83 #if defined(OBJFORMAT_ELF)
84 static int ocVerifyImage_ELF ( ObjectCode* oc );
85 static int ocGetNames_ELF ( ObjectCode* oc );
86 static int ocResolve_ELF ( ObjectCode* oc );
87 #elif defined(OBJFORMAT_PEi386)
88 static int ocVerifyImage_PEi386 ( ObjectCode* oc );
89 static int ocGetNames_PEi386 ( ObjectCode* oc );
90 static int ocResolve_PEi386 ( ObjectCode* oc );
91 #elif defined(OBJFORMAT_MACHO)
92 static int ocVerifyImage_MachO ( ObjectCode* oc );
93 static int ocGetNames_MachO ( ObjectCode* oc );
94 static int ocResolve_MachO ( ObjectCode* oc );
96 static void machoInitSymbolsWithoutUnderscore( void );
99 /* -----------------------------------------------------------------------------
100 * Built-in symbols from the RTS
103 typedef struct _RtsSymbolVal {
110 #define Maybe_ForeignObj SymX(mkForeignObjzh_fast)
112 #define Maybe_Stable_Names SymX(mkWeakzh_fast) \
113 SymX(makeStableNamezh_fast) \
114 SymX(finalizzeWeakzh_fast)
116 /* These are not available in GUM!!! -- HWL */
117 #define Maybe_ForeignObj
118 #define Maybe_Stable_Names
121 #if !defined (mingw32_TARGET_OS)
122 #define RTS_POSIX_ONLY_SYMBOLS \
123 SymX(stg_sig_install) \
127 #if defined (cygwin32_TARGET_OS)
128 #define RTS_MINGW_ONLY_SYMBOLS /**/
129 /* Don't have the ability to read import libs / archives, so
130 * we have to stupidly list a lot of what libcygwin.a
133 #define RTS_CYGWIN_ONLY_SYMBOLS \
211 #elif !defined(mingw32_TARGET_OS)
212 #define RTS_MINGW_ONLY_SYMBOLS /**/
213 #define RTS_CYGWIN_ONLY_SYMBOLS /**/
214 #else /* defined(mingw32_TARGET_OS) */
215 #define RTS_POSIX_ONLY_SYMBOLS /**/
216 #define RTS_CYGWIN_ONLY_SYMBOLS /**/
218 /* Extra syms gen'ed by mingw-2's gcc-3.2: */
220 #define RTS_MINGW_EXTRA_SYMS \
221 Sym(_imp____mb_cur_max) \
224 #define RTS_MINGW_EXTRA_SYMS
227 /* These are statically linked from the mingw libraries into the ghc
228 executable, so we have to employ this hack. */
229 #define RTS_MINGW_ONLY_SYMBOLS \
230 SymX(asyncReadzh_fast) \
231 SymX(asyncWritezh_fast) \
243 SymX(getservbyname) \
244 SymX(getservbyport) \
245 SymX(getprotobynumber) \
246 SymX(getprotobyname) \
247 SymX(gethostbyname) \
248 SymX(gethostbyaddr) \
283 Sym(_imp___timezone) \
291 RTS_MINGW_EXTRA_SYMS \
296 # define MAIN_CAP_SYM SymX(MainCapability)
298 # define MAIN_CAP_SYM
301 #define RTS_SYMBOLS \
305 SymX(stg_enter_info) \
306 SymX(stg_enter_ret) \
307 SymX(stg_gc_void_info) \
308 SymX(__stg_gc_enter_1) \
309 SymX(stg_gc_noregs) \
310 SymX(stg_gc_unpt_r1_info) \
311 SymX(stg_gc_unpt_r1) \
312 SymX(stg_gc_unbx_r1_info) \
313 SymX(stg_gc_unbx_r1) \
314 SymX(stg_gc_f1_info) \
316 SymX(stg_gc_d1_info) \
318 SymX(stg_gc_l1_info) \
321 SymX(stg_gc_fun_info) \
322 SymX(stg_gc_fun_ret) \
324 SymX(stg_gc_gen_info) \
325 SymX(stg_gc_gen_hp) \
327 SymX(stg_gen_yield) \
328 SymX(stg_yield_noregs) \
329 SymX(stg_yield_to_interpreter) \
330 SymX(stg_gen_block) \
331 SymX(stg_block_noregs) \
333 SymX(stg_block_takemvar) \
334 SymX(stg_block_putmvar) \
335 SymX(stg_seq_frame_info) \
338 SymX(MallocFailHook) \
340 SymX(OutOfHeapHook) \
341 SymX(PatErrorHdrHook) \
342 SymX(PostTraceHook) \
344 SymX(StackOverflowHook) \
345 SymX(__encodeDouble) \
346 SymX(__encodeFloat) \
349 SymX(__gmpz_cmp_si) \
350 SymX(__gmpz_cmp_ui) \
351 SymX(__gmpz_get_si) \
352 SymX(__gmpz_get_ui) \
353 SymX(__int_encodeDouble) \
354 SymX(__int_encodeFloat) \
355 SymX(andIntegerzh_fast) \
356 SymX(blockAsyncExceptionszh_fast) \
359 SymX(complementIntegerzh_fast) \
360 SymX(cmpIntegerzh_fast) \
361 SymX(cmpIntegerIntzh_fast) \
362 SymX(createAdjustor) \
363 SymX(decodeDoublezh_fast) \
364 SymX(decodeFloatzh_fast) \
367 SymX(deRefWeakzh_fast) \
368 SymX(deRefStablePtrzh_fast) \
369 SymX(divExactIntegerzh_fast) \
370 SymX(divModIntegerzh_fast) \
372 SymX(forkProcesszh_fast) \
373 SymX(forkOS_createThread) \
374 SymX(freeHaskellFunctionPtr) \
375 SymX(freeStablePtr) \
376 SymX(gcdIntegerzh_fast) \
377 SymX(gcdIntegerIntzh_fast) \
378 SymX(gcdIntzh_fast) \
382 SymX(int2Integerzh_fast) \
383 SymX(integer2Intzh_fast) \
384 SymX(integer2Wordzh_fast) \
385 SymX(isCurrentThreadBoundzh_fast) \
386 SymX(isDoubleDenormalized) \
387 SymX(isDoubleInfinite) \
389 SymX(isDoubleNegativeZero) \
390 SymX(isEmptyMVarzh_fast) \
391 SymX(isFloatDenormalized) \
392 SymX(isFloatInfinite) \
394 SymX(isFloatNegativeZero) \
395 SymX(killThreadzh_fast) \
396 SymX(makeStablePtrzh_fast) \
397 SymX(minusIntegerzh_fast) \
398 SymX(mkApUpd0zh_fast) \
399 SymX(myThreadIdzh_fast) \
400 SymX(labelThreadzh_fast) \
401 SymX(newArrayzh_fast) \
402 SymX(newBCOzh_fast) \
403 SymX(newByteArrayzh_fast) \
404 SymX_redirect(newCAF, newDynCAF) \
405 SymX(newMVarzh_fast) \
406 SymX(newMutVarzh_fast) \
407 SymX(atomicModifyMutVarzh_fast) \
408 SymX(newPinnedByteArrayzh_fast) \
409 SymX(orIntegerzh_fast) \
411 SymX(plusIntegerzh_fast) \
414 SymX(putMVarzh_fast) \
415 SymX(quotIntegerzh_fast) \
416 SymX(quotRemIntegerzh_fast) \
418 SymX(raiseIOzh_fast) \
419 SymX(remIntegerzh_fast) \
420 SymX(resetNonBlockingFd) \
423 SymX(rts_checkSchedStatus) \
426 SymX(rts_evalLazyIO) \
427 SymX(rts_evalStableIO) \
431 SymX(rts_getDouble) \
436 SymX(rts_getFunPtr) \
437 SymX(rts_getStablePtr) \
438 SymX(rts_getThreadId) \
440 SymX(rts_getWord32) \
453 SymX(rts_mkStablePtr) \
461 SymX(rtsSupportsBoundThreads) \
464 SymX(startupHaskell) \
465 SymX(shutdownHaskell) \
466 SymX(shutdownHaskellAndExit) \
467 SymX(stable_ptr_table) \
468 SymX(stackOverflow) \
469 SymX(stg_CAF_BLACKHOLE_info) \
470 SymX(stg_BLACKHOLE_BQ_info) \
471 SymX(awakenBlockedQueue) \
472 SymX(stg_CHARLIKE_closure) \
473 SymX(stg_EMPTY_MVAR_info) \
474 SymX(stg_IND_STATIC_info) \
475 SymX(stg_INTLIKE_closure) \
476 SymX(stg_MUT_ARR_PTRS_FROZEN_info) \
477 SymX(stg_WEAK_info) \
478 SymX(stg_ap_v_info) \
479 SymX(stg_ap_f_info) \
480 SymX(stg_ap_d_info) \
481 SymX(stg_ap_l_info) \
482 SymX(stg_ap_n_info) \
483 SymX(stg_ap_p_info) \
484 SymX(stg_ap_pv_info) \
485 SymX(stg_ap_pp_info) \
486 SymX(stg_ap_ppv_info) \
487 SymX(stg_ap_ppp_info) \
488 SymX(stg_ap_pppp_info) \
489 SymX(stg_ap_ppppp_info) \
490 SymX(stg_ap_pppppp_info) \
491 SymX(stg_ap_ppppppp_info) \
499 SymX(stg_ap_pv_ret) \
500 SymX(stg_ap_pp_ret) \
501 SymX(stg_ap_ppv_ret) \
502 SymX(stg_ap_ppp_ret) \
503 SymX(stg_ap_pppp_ret) \
504 SymX(stg_ap_ppppp_ret) \
505 SymX(stg_ap_pppppp_ret) \
506 SymX(stg_ap_ppppppp_ret) \
507 SymX(stg_ap_1_upd_info) \
508 SymX(stg_ap_2_upd_info) \
509 SymX(stg_ap_3_upd_info) \
510 SymX(stg_ap_4_upd_info) \
511 SymX(stg_ap_5_upd_info) \
512 SymX(stg_ap_6_upd_info) \
513 SymX(stg_ap_7_upd_info) \
514 SymX(stg_ap_8_upd_info) \
516 SymX(stg_sel_0_upd_info) \
517 SymX(stg_sel_10_upd_info) \
518 SymX(stg_sel_11_upd_info) \
519 SymX(stg_sel_12_upd_info) \
520 SymX(stg_sel_13_upd_info) \
521 SymX(stg_sel_14_upd_info) \
522 SymX(stg_sel_15_upd_info) \
523 SymX(stg_sel_1_upd_info) \
524 SymX(stg_sel_2_upd_info) \
525 SymX(stg_sel_3_upd_info) \
526 SymX(stg_sel_4_upd_info) \
527 SymX(stg_sel_5_upd_info) \
528 SymX(stg_sel_6_upd_info) \
529 SymX(stg_sel_7_upd_info) \
530 SymX(stg_sel_8_upd_info) \
531 SymX(stg_sel_9_upd_info) \
532 SymX(stg_upd_frame_info) \
533 SymX(suspendThread) \
534 SymX(takeMVarzh_fast) \
535 SymX(timesIntegerzh_fast) \
536 SymX(tryPutMVarzh_fast) \
537 SymX(tryTakeMVarzh_fast) \
538 SymX(unblockAsyncExceptionszh_fast) \
539 SymX(unsafeThawArrayzh_fast) \
540 SymX(waitReadzh_fast) \
541 SymX(waitWritezh_fast) \
542 SymX(word2Integerzh_fast) \
543 SymX(xorIntegerzh_fast) \
546 #ifdef SUPPORT_LONG_LONGS
547 #define RTS_LONG_LONG_SYMS \
548 SymX(int64ToIntegerzh_fast) \
549 SymX(word64ToIntegerzh_fast)
551 #define RTS_LONG_LONG_SYMS /* nothing */
554 // 64-bit support functions in libgcc.a
555 #if defined(__GNUC__) && SIZEOF_VOID_P <= 4
556 #define RTS_LIBGCC_SYMBOLS \
565 #elif defined(ia64_TARGET_ARCH)
566 #define RTS_LIBGCC_SYMBOLS \
574 #define RTS_LIBGCC_SYMBOLS
577 #ifdef darwin_TARGET_OS
578 // Symbols that don't have a leading underscore
579 // on Mac OS X. They have to receive special treatment,
580 // see machoInitSymbolsWithoutUnderscore()
581 #define RTS_MACHO_NOUNDERLINE_SYMBOLS \
586 /* entirely bogus claims about types of these symbols */
587 #define Sym(vvv) extern void vvv(void);
588 #define SymX(vvv) /**/
589 #define SymX_redirect(vvv,xxx) /**/
592 RTS_POSIX_ONLY_SYMBOLS
593 RTS_MINGW_ONLY_SYMBOLS
594 RTS_CYGWIN_ONLY_SYMBOLS
600 #ifdef LEADING_UNDERSCORE
601 #define MAYBE_LEADING_UNDERSCORE_STR(s) ("_" s)
603 #define MAYBE_LEADING_UNDERSCORE_STR(s) (s)
606 #define Sym(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
608 #define SymX(vvv) Sym(vvv)
610 // SymX_redirect allows us to redirect references to one symbol to
611 // another symbol. See newCAF/newDynCAF for an example.
612 #define SymX_redirect(vvv,xxx) \
613 { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
616 static RtsSymbolVal rtsSyms[] = {
619 RTS_POSIX_ONLY_SYMBOLS
620 RTS_MINGW_ONLY_SYMBOLS
621 RTS_CYGWIN_ONLY_SYMBOLS
623 { 0, 0 } /* sentinel */
626 /* -----------------------------------------------------------------------------
627 * Insert symbols into hash tables, checking for duplicates.
629 static void ghciInsertStrHashTable ( char* obj_name,
635 if (lookupHashTable(table, (StgWord)key) == NULL)
637 insertStrHashTable(table, (StgWord)key, data);
642 "GHCi runtime linker: fatal error: I found a duplicate definition for symbol\n"
644 "whilst processing object file\n"
646 "This could be caused by:\n"
647 " * Loading two different object files which export the same symbol\n"
648 " * Specifying the same object file twice on the GHCi command line\n"
649 " * An incorrect `package.conf' entry, causing some object to be\n"
651 "GHCi cannot safely continue in this situation. Exiting now. Sorry.\n"
660 /* -----------------------------------------------------------------------------
661 * initialize the object linker
665 static int linker_init_done = 0 ;
667 #if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
668 static void *dl_prog_handle;
676 /* Make initLinker idempotent, so we can call it
677 before evey relevant operation; that means we
678 don't need to initialise the linker separately */
679 if (linker_init_done == 1) { return; } else {
680 linker_init_done = 1;
683 symhash = allocStrHashTable();
685 /* populate the symbol table with stuff from the RTS */
686 for (sym = rtsSyms; sym->lbl != NULL; sym++) {
687 ghciInsertStrHashTable("(GHCi built-in symbols)",
688 symhash, sym->lbl, sym->addr);
690 # if defined(OBJFORMAT_MACHO)
691 machoInitSymbolsWithoutUnderscore();
694 # if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
695 dl_prog_handle = dlopen(NULL, RTLD_LAZY);
699 /* -----------------------------------------------------------------------------
700 * Loading DLL or .so dynamic libraries
701 * -----------------------------------------------------------------------------
703 * Add a DLL from which symbols may be found. In the ELF case, just
704 * do RTLD_GLOBAL-style add, so no further messing around needs to
705 * happen in order that symbols in the loaded .so are findable --
706 * lookupSymbol() will subsequently see them by dlsym on the program's
707 * dl-handle. Returns NULL if success, otherwise ptr to an err msg.
709 * In the PEi386 case, open the DLLs and put handles to them in a
710 * linked list. When looking for a symbol, try all handles in the
711 * list. This means that we need to load even DLLs that are guaranteed
712 * to be in the ghc.exe image already, just so we can get a handle
713 * to give to loadSymbol, so that we can find the symbols. For such
714 * libraries, the LoadLibrary call should be a no-op except for returning
719 #if defined(OBJFORMAT_PEi386)
720 /* A record for storing handles into DLLs. */
725 struct _OpenedDLL* next;
730 /* A list thereof. */
731 static OpenedDLL* opened_dlls = NULL;
735 addDLL( char *dll_name )
737 # if defined(OBJFORMAT_ELF) || defined(OBJFORMAT_MACHO)
738 /* ------------------- ELF DLL loader ------------------- */
744 #if !defined(openbsd_TARGET_OS)
745 hdl= dlopen(dll_name, RTLD_NOW | RTLD_GLOBAL);
747 hdl= dlopen(dll_name, RTLD_LAZY);
750 /* dlopen failed; return a ptr to the error msg. */
752 if (errmsg == NULL) errmsg = "addDLL: unknown error";
759 # elif defined(OBJFORMAT_PEi386)
760 /* ------------------- Win32 DLL loader ------------------- */
768 /* fprintf(stderr, "\naddDLL; dll_name = `%s'\n", dll_name); */
770 /* See if we've already got it, and ignore if so. */
771 for (o_dll = opened_dlls; o_dll != NULL; o_dll = o_dll->next) {
772 if (0 == strcmp(o_dll->name, dll_name))
776 /* The file name has no suffix (yet) so that we can try
777 both foo.dll and foo.drv
779 The documentation for LoadLibrary says:
780 If no file name extension is specified in the lpFileName
781 parameter, the default library extension .dll is
782 appended. However, the file name string can include a trailing
783 point character (.) to indicate that the module name has no
786 buf = stgMallocBytes(strlen(dll_name) + 10, "addDLL");
787 sprintf(buf, "%s.DLL", dll_name);
788 instance = LoadLibrary(buf);
789 if (instance == NULL) {
790 sprintf(buf, "%s.DRV", dll_name); // KAA: allow loading of drivers (like winspool.drv)
791 instance = LoadLibrary(buf);
792 if (instance == NULL) {
795 /* LoadLibrary failed; return a ptr to the error msg. */
796 return "addDLL: unknown error";
801 /* Add this DLL to the list of DLLs in which to search for symbols. */
802 o_dll = stgMallocBytes( sizeof(OpenedDLL), "addDLL" );
803 o_dll->name = stgMallocBytes(1+strlen(dll_name), "addDLL");
804 strcpy(o_dll->name, dll_name);
805 o_dll->instance = instance;
806 o_dll->next = opened_dlls;
811 barf("addDLL: not implemented on this platform");
815 /* -----------------------------------------------------------------------------
816 * lookup a symbol in the hash table
819 lookupSymbol( char *lbl )
823 ASSERT(symhash != NULL);
824 val = lookupStrHashTable(symhash, lbl);
827 # if defined(OBJFORMAT_ELF)
828 return dlsym(dl_prog_handle, lbl);
829 # elif defined(OBJFORMAT_MACHO)
830 if(NSIsSymbolNameDefined(lbl)) {
831 NSSymbol symbol = NSLookupAndBindSymbol(lbl);
832 return NSAddressOfSymbol(symbol);
836 # elif defined(OBJFORMAT_PEi386)
839 for (o_dll = opened_dlls; o_dll != NULL; o_dll = o_dll->next) {
840 /* fprintf(stderr, "look in %s for %s\n", o_dll->name, lbl); */
842 /* HACK: if the name has an initial underscore, try stripping
843 it off & look that up first. I've yet to verify whether there's
844 a Rule that governs whether an initial '_' *should always* be
845 stripped off when mapping from import lib name to the DLL name.
847 sym = GetProcAddress(o_dll->instance, (lbl+1));
849 /*fprintf(stderr, "found %s in %s\n", lbl+1,o_dll->name); fflush(stderr);*/
853 sym = GetProcAddress(o_dll->instance, lbl);
855 /*fprintf(stderr, "found %s in %s\n", lbl,o_dll->name); fflush(stderr);*/
870 __attribute((unused))
872 lookupLocalSymbol( ObjectCode* oc, char *lbl )
876 val = lookupStrHashTable(oc->lochash, lbl);
886 /* -----------------------------------------------------------------------------
887 * Debugging aid: look in GHCi's object symbol tables for symbols
888 * within DELTA bytes of the specified address, and show their names.
891 void ghci_enquire ( char* addr );
893 void ghci_enquire ( char* addr )
898 const int DELTA = 64;
903 for (oc = objects; oc; oc = oc->next) {
904 for (i = 0; i < oc->n_symbols; i++) {
905 sym = oc->symbols[i];
906 if (sym == NULL) continue;
907 // fprintf(stderr, "enquire %p %p\n", sym, oc->lochash);
909 if (oc->lochash != NULL) {
910 a = lookupStrHashTable(oc->lochash, sym);
913 a = lookupStrHashTable(symhash, sym);
916 // fprintf(stderr, "ghci_enquire: can't find %s\n", sym);
918 else if (addr-DELTA <= a && a <= addr+DELTA) {
919 fprintf(stderr, "%p + %3d == `%s'\n", addr, a - addr, sym);
926 #ifdef ia64_TARGET_ARCH
927 static unsigned int PLTSize(void);
930 /* -----------------------------------------------------------------------------
931 * Load an obj (populate the global symbol table, but don't resolve yet)
933 * Returns: 1 if ok, 0 on error.
936 loadObj( char *path )
950 /* fprintf(stderr, "loadObj %s\n", path ); */
952 /* Check that we haven't already loaded this object. Don't give up
953 at this stage; ocGetNames_* will barf later. */
957 for (o = objects; o; o = o->next) {
958 if (0 == strcmp(o->fileName, path))
964 "GHCi runtime linker: warning: looks like you're trying to load the\n"
965 "same object file twice:\n"
967 "GHCi will continue, but a duplicate-symbol error may shortly follow.\n"
973 oc = stgMallocBytes(sizeof(ObjectCode), "loadObj(oc)");
975 # if defined(OBJFORMAT_ELF)
976 oc->formatName = "ELF";
977 # elif defined(OBJFORMAT_PEi386)
978 oc->formatName = "PEi386";
979 # elif defined(OBJFORMAT_MACHO)
980 oc->formatName = "Mach-O";
983 barf("loadObj: not implemented on this platform");
987 if (r == -1) { return 0; }
989 /* sigh, strdup() isn't a POSIX function, so do it the long way */
990 oc->fileName = stgMallocBytes( strlen(path)+1, "loadObj" );
991 strcpy(oc->fileName, path);
993 oc->fileSize = st.st_size;
996 oc->lochash = allocStrHashTable();
997 oc->proddables = NULL;
999 /* chain it onto the list of objects */
1004 #define ROUND_UP(x,size) ((x + size - 1) & ~(size - 1))
1006 /* On many architectures malloc'd memory isn't executable, so we need to use mmap. */
1008 fd = open(path, O_RDONLY);
1010 barf("loadObj: can't open `%s'", path);
1012 pagesize = getpagesize();
1014 #ifdef ia64_TARGET_ARCH
1015 /* The PLT needs to be right before the object */
1016 n = ROUND_UP(PLTSize(), pagesize);
1017 oc->plt = mmap(NULL, n, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
1018 if (oc->plt == MAP_FAILED)
1019 barf("loadObj: can't allocate PLT");
1022 map_addr = oc->plt + n;
1025 n = ROUND_UP(oc->fileSize, pagesize);
1026 oc->image = mmap(map_addr, n, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
1027 if (oc->image == MAP_FAILED)
1028 barf("loadObj: can't map `%s'", path);
1032 #else /* !USE_MMAP */
1034 oc->image = stgMallocBytes(oc->fileSize, "loadObj(image)");
1036 /* load the image into memory */
1037 f = fopen(path, "rb");
1039 barf("loadObj: can't read `%s'", path);
1041 n = fread ( oc->image, 1, oc->fileSize, f );
1042 if (n != oc->fileSize)
1043 barf("loadObj: error whilst reading `%s'", path);
1047 #endif /* USE_MMAP */
1049 /* verify the in-memory image */
1050 # if defined(OBJFORMAT_ELF)
1051 r = ocVerifyImage_ELF ( oc );
1052 # elif defined(OBJFORMAT_PEi386)
1053 r = ocVerifyImage_PEi386 ( oc );
1054 # elif defined(OBJFORMAT_MACHO)
1055 r = ocVerifyImage_MachO ( oc );
1057 barf("loadObj: no verify method");
1059 if (!r) { return r; }
1061 /* build the symbol list for this image */
1062 # if defined(OBJFORMAT_ELF)
1063 r = ocGetNames_ELF ( oc );
1064 # elif defined(OBJFORMAT_PEi386)
1065 r = ocGetNames_PEi386 ( oc );
1066 # elif defined(OBJFORMAT_MACHO)
1067 r = ocGetNames_MachO ( oc );
1069 barf("loadObj: no getNames method");
1071 if (!r) { return r; }
1073 /* loaded, but not resolved yet */
1074 oc->status = OBJECT_LOADED;
1079 /* -----------------------------------------------------------------------------
1080 * resolve all the currently unlinked objects in memory
1082 * Returns: 1 if ok, 0 on error.
1092 for (oc = objects; oc; oc = oc->next) {
1093 if (oc->status != OBJECT_RESOLVED) {
1094 # if defined(OBJFORMAT_ELF)
1095 r = ocResolve_ELF ( oc );
1096 # elif defined(OBJFORMAT_PEi386)
1097 r = ocResolve_PEi386 ( oc );
1098 # elif defined(OBJFORMAT_MACHO)
1099 r = ocResolve_MachO ( oc );
1101 barf("resolveObjs: not implemented on this platform");
1103 if (!r) { return r; }
1104 oc->status = OBJECT_RESOLVED;
1110 /* -----------------------------------------------------------------------------
1111 * delete an object from the pool
1114 unloadObj( char *path )
1116 ObjectCode *oc, *prev;
1118 ASSERT(symhash != NULL);
1119 ASSERT(objects != NULL);
1124 for (oc = objects; oc; prev = oc, oc = oc->next) {
1125 if (!strcmp(oc->fileName,path)) {
1127 /* Remove all the mappings for the symbols within this
1132 for (i = 0; i < oc->n_symbols; i++) {
1133 if (oc->symbols[i] != NULL) {
1134 removeStrHashTable(symhash, oc->symbols[i], NULL);
1142 prev->next = oc->next;
1145 /* We're going to leave this in place, in case there are
1146 any pointers from the heap into it: */
1147 /* stgFree(oc->image); */
1148 stgFree(oc->fileName);
1149 stgFree(oc->symbols);
1150 stgFree(oc->sections);
1151 /* The local hash table should have been freed at the end
1152 of the ocResolve_ call on it. */
1153 ASSERT(oc->lochash == NULL);
1159 belch("unloadObj: can't find `%s' to unload", path);
1163 /* -----------------------------------------------------------------------------
1164 * Sanity checking. For each ObjectCode, maintain a list of address ranges
1165 * which may be prodded during relocation, and abort if we try and write
1166 * outside any of these.
1168 static void addProddableBlock ( ObjectCode* oc, void* start, int size )
1171 = stgMallocBytes(sizeof(ProddableBlock), "addProddableBlock");
1172 /* fprintf(stderr, "aPB %p %p %d\n", oc, start, size); */
1176 pb->next = oc->proddables;
1177 oc->proddables = pb;
1180 static void checkProddableBlock ( ObjectCode* oc, void* addr )
1183 for (pb = oc->proddables; pb != NULL; pb = pb->next) {
1184 char* s = (char*)(pb->start);
1185 char* e = s + pb->size - 1;
1186 char* a = (char*)addr;
1187 /* Assumes that the biggest fixup involves a 4-byte write. This
1188 probably needs to be changed to 8 (ie, +7) on 64-bit
1190 if (a >= s && (a+3) <= e) return;
1192 barf("checkProddableBlock: invalid fixup in runtime linker");
1195 /* -----------------------------------------------------------------------------
1196 * Section management.
1198 static void addSection ( ObjectCode* oc, SectionKind kind,
1199 void* start, void* end )
1201 Section* s = stgMallocBytes(sizeof(Section), "addSection");
1205 s->next = oc->sections;
1208 fprintf(stderr, "addSection: %p-%p (size %d), kind %d\n",
1209 start, ((char*)end)-1, end - start + 1, kind );
1215 /* --------------------------------------------------------------------------
1216 * PEi386 specifics (Win32 targets)
1217 * ------------------------------------------------------------------------*/
1219 /* The information for this linker comes from
1220 Microsoft Portable Executable
1221 and Common Object File Format Specification
1222 revision 5.1 January 1998
1223 which SimonM says comes from the MS Developer Network CDs.
1225 It can be found there (on older CDs), but can also be found
1228 http://www.microsoft.com/hwdev/hardware/PECOFF.asp
1230 (this is Rev 6.0 from February 1999).
1232 Things move, so if that fails, try searching for it via
1234 http://www.google.com/search?q=PE+COFF+specification
1236 The ultimate reference for the PE format is the Winnt.h
1237 header file that comes with the Platform SDKs; as always,
1238 implementations will drift wrt their documentation.
1240 A good background article on the PE format is Matt Pietrek's
1241 March 1994 article in Microsoft System Journal (MSJ)
1242 (Vol.9, No. 3): "Peering Inside the PE: A Tour of the
1243 Win32 Portable Executable File Format." The info in there
1244 has recently been updated in a two part article in
1245 MSDN magazine, issues Feb and March 2002,
1246 "Inside Windows: An In-Depth Look into the Win32 Portable
1247 Executable File Format"
1249 John Levine's book "Linkers and Loaders" contains useful
1254 #if defined(OBJFORMAT_PEi386)
1258 typedef unsigned char UChar;
1259 typedef unsigned short UInt16;
1260 typedef unsigned int UInt32;
1267 UInt16 NumberOfSections;
1268 UInt32 TimeDateStamp;
1269 UInt32 PointerToSymbolTable;
1270 UInt32 NumberOfSymbols;
1271 UInt16 SizeOfOptionalHeader;
1272 UInt16 Characteristics;
1276 #define sizeof_COFF_header 20
1283 UInt32 VirtualAddress;
1284 UInt32 SizeOfRawData;
1285 UInt32 PointerToRawData;
1286 UInt32 PointerToRelocations;
1287 UInt32 PointerToLinenumbers;
1288 UInt16 NumberOfRelocations;
1289 UInt16 NumberOfLineNumbers;
1290 UInt32 Characteristics;
1294 #define sizeof_COFF_section 40
1301 UInt16 SectionNumber;
1304 UChar NumberOfAuxSymbols;
1308 #define sizeof_COFF_symbol 18
1313 UInt32 VirtualAddress;
1314 UInt32 SymbolTableIndex;
1319 #define sizeof_COFF_reloc 10
1322 /* From PE spec doc, section 3.3.2 */
1323 /* Note use of MYIMAGE_* since IMAGE_* are already defined in
1324 windows.h -- for the same purpose, but I want to know what I'm
1326 #define MYIMAGE_FILE_RELOCS_STRIPPED 0x0001
1327 #define MYIMAGE_FILE_EXECUTABLE_IMAGE 0x0002
1328 #define MYIMAGE_FILE_DLL 0x2000
1329 #define MYIMAGE_FILE_SYSTEM 0x1000
1330 #define MYIMAGE_FILE_BYTES_REVERSED_HI 0x8000
1331 #define MYIMAGE_FILE_BYTES_REVERSED_LO 0x0080
1332 #define MYIMAGE_FILE_32BIT_MACHINE 0x0100
1334 /* From PE spec doc, section 5.4.2 and 5.4.4 */
1335 #define MYIMAGE_SYM_CLASS_EXTERNAL 2
1336 #define MYIMAGE_SYM_CLASS_STATIC 3
1337 #define MYIMAGE_SYM_UNDEFINED 0
1339 /* From PE spec doc, section 4.1 */
1340 #define MYIMAGE_SCN_CNT_CODE 0x00000020
1341 #define MYIMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
1342 #define MYIMAGE_SCN_LNK_NRELOC_OVFL 0x01000000
1344 /* From PE spec doc, section 5.2.1 */
1345 #define MYIMAGE_REL_I386_DIR32 0x0006
1346 #define MYIMAGE_REL_I386_REL32 0x0014
1349 /* We use myindex to calculate array addresses, rather than
1350 simply doing the normal subscript thing. That's because
1351 some of the above structs have sizes which are not
1352 a whole number of words. GCC rounds their sizes up to a
1353 whole number of words, which means that the address calcs
1354 arising from using normal C indexing or pointer arithmetic
1355 are just plain wrong. Sigh.
1358 myindex ( int scale, void* base, int index )
1361 ((UChar*)base) + scale * index;
1366 printName ( UChar* name, UChar* strtab )
1368 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1369 UInt32 strtab_offset = * (UInt32*)(name+4);
1370 fprintf ( stderr, "%s", strtab + strtab_offset );
1373 for (i = 0; i < 8; i++) {
1374 if (name[i] == 0) break;
1375 fprintf ( stderr, "%c", name[i] );
1382 copyName ( UChar* name, UChar* strtab, UChar* dst, int dstSize )
1384 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1385 UInt32 strtab_offset = * (UInt32*)(name+4);
1386 strncpy ( dst, strtab+strtab_offset, dstSize );
1392 if (name[i] == 0) break;
1402 cstring_from_COFF_symbol_name ( UChar* name, UChar* strtab )
1405 /* If the string is longer than 8 bytes, look in the
1406 string table for it -- this will be correctly zero terminated.
1408 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
1409 UInt32 strtab_offset = * (UInt32*)(name+4);
1410 return ((UChar*)strtab) + strtab_offset;
1412 /* Otherwise, if shorter than 8 bytes, return the original,
1413 which by defn is correctly terminated.
1415 if (name[7]==0) return name;
1416 /* The annoying case: 8 bytes. Copy into a temporary
1417 (which is never freed ...)
1419 newstr = stgMallocBytes(9, "cstring_from_COFF_symbol_name");
1421 strncpy(newstr,name,8);
1427 /* Just compares the short names (first 8 chars) */
1428 static COFF_section *
1429 findPEi386SectionCalled ( ObjectCode* oc, char* name )
1433 = (COFF_header*)(oc->image);
1434 COFF_section* sectab
1436 ((UChar*)(oc->image))
1437 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1439 for (i = 0; i < hdr->NumberOfSections; i++) {
1442 COFF_section* section_i
1444 myindex ( sizeof_COFF_section, sectab, i );
1445 n1 = (UChar*) &(section_i->Name);
1447 if (n1[0]==n2[0] && n1[1]==n2[1] && n1[2]==n2[2] &&
1448 n1[3]==n2[3] && n1[4]==n2[4] && n1[5]==n2[5] &&
1449 n1[6]==n2[6] && n1[7]==n2[7])
1458 zapTrailingAtSign ( UChar* sym )
1460 # define my_isdigit(c) ((c) >= '0' && (c) <= '9')
1462 if (sym[0] == 0) return;
1464 while (sym[i] != 0) i++;
1467 while (j > 0 && my_isdigit(sym[j])) j--;
1468 if (j > 0 && sym[j] == '@' && j != i) sym[j] = 0;
1474 ocVerifyImage_PEi386 ( ObjectCode* oc )
1479 COFF_section* sectab;
1480 COFF_symbol* symtab;
1482 /* fprintf(stderr, "\nLOADING %s\n", oc->fileName); */
1483 hdr = (COFF_header*)(oc->image);
1484 sectab = (COFF_section*) (
1485 ((UChar*)(oc->image))
1486 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1488 symtab = (COFF_symbol*) (
1489 ((UChar*)(oc->image))
1490 + hdr->PointerToSymbolTable
1492 strtab = ((UChar*)symtab)
1493 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
1495 if (hdr->Machine != 0x14c) {
1496 belch("Not x86 PEi386");
1499 if (hdr->SizeOfOptionalHeader != 0) {
1500 belch("PEi386 with nonempty optional header");
1503 if ( /* (hdr->Characteristics & MYIMAGE_FILE_RELOCS_STRIPPED) || */
1504 (hdr->Characteristics & MYIMAGE_FILE_EXECUTABLE_IMAGE) ||
1505 (hdr->Characteristics & MYIMAGE_FILE_DLL) ||
1506 (hdr->Characteristics & MYIMAGE_FILE_SYSTEM) ) {
1507 belch("Not a PEi386 object file");
1510 if ( (hdr->Characteristics & MYIMAGE_FILE_BYTES_REVERSED_HI)
1511 /* || !(hdr->Characteristics & MYIMAGE_FILE_32BIT_MACHINE) */ ) {
1512 belch("Invalid PEi386 word size or endiannness: %d",
1513 (int)(hdr->Characteristics));
1516 /* If the string table size is way crazy, this might indicate that
1517 there are more than 64k relocations, despite claims to the
1518 contrary. Hence this test. */
1519 /* fprintf(stderr, "strtab size %d\n", * (UInt32*)strtab); */
1521 if ( (*(UInt32*)strtab) > 600000 ) {
1522 /* Note that 600k has no special significance other than being
1523 big enough to handle the almost-2MB-sized lumps that
1524 constitute HSwin32*.o. */
1525 belch("PEi386 object has suspiciously large string table; > 64k relocs?");
1530 /* No further verification after this point; only debug printing. */
1532 IF_DEBUG(linker, i=1);
1533 if (i == 0) return 1;
1536 "sectab offset = %d\n", ((UChar*)sectab) - ((UChar*)hdr) );
1538 "symtab offset = %d\n", ((UChar*)symtab) - ((UChar*)hdr) );
1540 "strtab offset = %d\n", ((UChar*)strtab) - ((UChar*)hdr) );
1542 fprintf ( stderr, "\n" );
1544 "Machine: 0x%x\n", (UInt32)(hdr->Machine) );
1546 "# sections: %d\n", (UInt32)(hdr->NumberOfSections) );
1548 "time/date: 0x%x\n", (UInt32)(hdr->TimeDateStamp) );
1550 "symtab offset: %d\n", (UInt32)(hdr->PointerToSymbolTable) );
1552 "# symbols: %d\n", (UInt32)(hdr->NumberOfSymbols) );
1554 "sz of opt hdr: %d\n", (UInt32)(hdr->SizeOfOptionalHeader) );
1556 "characteristics: 0x%x\n", (UInt32)(hdr->Characteristics) );
1558 /* Print the section table. */
1559 fprintf ( stderr, "\n" );
1560 for (i = 0; i < hdr->NumberOfSections; i++) {
1562 COFF_section* sectab_i
1564 myindex ( sizeof_COFF_section, sectab, i );
1571 printName ( sectab_i->Name, strtab );
1581 sectab_i->VirtualSize,
1582 sectab_i->VirtualAddress,
1583 sectab_i->SizeOfRawData,
1584 sectab_i->PointerToRawData,
1585 sectab_i->NumberOfRelocations,
1586 sectab_i->PointerToRelocations,
1587 sectab_i->PointerToRawData
1589 reltab = (COFF_reloc*) (
1590 ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
1593 if ( sectab_i->Characteristics & MYIMAGE_SCN_LNK_NRELOC_OVFL ) {
1594 /* If the relocation field (a short) has overflowed, the
1595 * real count can be found in the first reloc entry.
1597 * See Section 4.1 (last para) of the PE spec (rev6.0).
1599 COFF_reloc* rel = (COFF_reloc*)
1600 myindex ( sizeof_COFF_reloc, reltab, 0 );
1601 noRelocs = rel->VirtualAddress;
1604 noRelocs = sectab_i->NumberOfRelocations;
1608 for (; j < noRelocs; j++) {
1610 COFF_reloc* rel = (COFF_reloc*)
1611 myindex ( sizeof_COFF_reloc, reltab, j );
1613 " type 0x%-4x vaddr 0x%-8x name `",
1615 rel->VirtualAddress );
1616 sym = (COFF_symbol*)
1617 myindex ( sizeof_COFF_symbol, symtab, rel->SymbolTableIndex );
1618 /* Hmm..mysterious looking offset - what's it for? SOF */
1619 printName ( sym->Name, strtab -10 );
1620 fprintf ( stderr, "'\n" );
1623 fprintf ( stderr, "\n" );
1625 fprintf ( stderr, "\n" );
1626 fprintf ( stderr, "string table has size 0x%x\n", * (UInt32*)strtab );
1627 fprintf ( stderr, "---START of string table---\n");
1628 for (i = 4; i < *(Int32*)strtab; i++) {
1630 fprintf ( stderr, "\n"); else
1631 fprintf( stderr, "%c", strtab[i] );
1633 fprintf ( stderr, "--- END of string table---\n");
1635 fprintf ( stderr, "\n" );
1638 COFF_symbol* symtab_i;
1639 if (i >= (Int32)(hdr->NumberOfSymbols)) break;
1640 symtab_i = (COFF_symbol*)
1641 myindex ( sizeof_COFF_symbol, symtab, i );
1647 printName ( symtab_i->Name, strtab );
1656 (Int32)(symtab_i->SectionNumber),
1657 (UInt32)symtab_i->Type,
1658 (UInt32)symtab_i->StorageClass,
1659 (UInt32)symtab_i->NumberOfAuxSymbols
1661 i += symtab_i->NumberOfAuxSymbols;
1665 fprintf ( stderr, "\n" );
1671 ocGetNames_PEi386 ( ObjectCode* oc )
1674 COFF_section* sectab;
1675 COFF_symbol* symtab;
1682 hdr = (COFF_header*)(oc->image);
1683 sectab = (COFF_section*) (
1684 ((UChar*)(oc->image))
1685 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1687 symtab = (COFF_symbol*) (
1688 ((UChar*)(oc->image))
1689 + hdr->PointerToSymbolTable
1691 strtab = ((UChar*)(oc->image))
1692 + hdr->PointerToSymbolTable
1693 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
1695 /* Allocate space for any (local, anonymous) .bss sections. */
1697 for (i = 0; i < hdr->NumberOfSections; i++) {
1699 COFF_section* sectab_i
1701 myindex ( sizeof_COFF_section, sectab, i );
1702 if (0 != strcmp(sectab_i->Name, ".bss")) continue;
1703 if (sectab_i->VirtualSize == 0) continue;
1704 /* This is a non-empty .bss section. Allocate zeroed space for
1705 it, and set its PointerToRawData field such that oc->image +
1706 PointerToRawData == addr_of_zeroed_space. */
1707 zspace = stgCallocBytes(1, sectab_i->VirtualSize,
1708 "ocGetNames_PEi386(anonymous bss)");
1709 sectab_i->PointerToRawData = ((UChar*)zspace) - ((UChar*)(oc->image));
1710 addProddableBlock(oc, zspace, sectab_i->VirtualSize);
1711 /* fprintf(stderr, "BSS anon section at 0x%x\n", zspace); */
1714 /* Copy section information into the ObjectCode. */
1716 for (i = 0; i < hdr->NumberOfSections; i++) {
1722 = SECTIONKIND_OTHER;
1723 COFF_section* sectab_i
1725 myindex ( sizeof_COFF_section, sectab, i );
1726 IF_DEBUG(linker, belch("section name = %s\n", sectab_i->Name ));
1729 /* I'm sure this is the Right Way to do it. However, the
1730 alternative of testing the sectab_i->Name field seems to
1731 work ok with Cygwin.
1733 if (sectab_i->Characteristics & MYIMAGE_SCN_CNT_CODE ||
1734 sectab_i->Characteristics & MYIMAGE_SCN_CNT_INITIALIZED_DATA)
1735 kind = SECTIONKIND_CODE_OR_RODATA;
1738 if (0==strcmp(".text",sectab_i->Name) ||
1739 0==strcmp(".rodata",sectab_i->Name))
1740 kind = SECTIONKIND_CODE_OR_RODATA;
1741 if (0==strcmp(".data",sectab_i->Name) ||
1742 0==strcmp(".bss",sectab_i->Name))
1743 kind = SECTIONKIND_RWDATA;
1745 ASSERT(sectab_i->SizeOfRawData == 0 || sectab_i->VirtualSize == 0);
1746 sz = sectab_i->SizeOfRawData;
1747 if (sz < sectab_i->VirtualSize) sz = sectab_i->VirtualSize;
1749 start = ((UChar*)(oc->image)) + sectab_i->PointerToRawData;
1750 end = start + sz - 1;
1752 if (kind == SECTIONKIND_OTHER
1753 /* Ignore sections called which contain stabs debugging
1755 && 0 != strcmp(".stab", sectab_i->Name)
1756 && 0 != strcmp(".stabstr", sectab_i->Name)
1758 belch("Unknown PEi386 section name `%s'", sectab_i->Name);
1762 if (kind != SECTIONKIND_OTHER && end >= start) {
1763 addSection(oc, kind, start, end);
1764 addProddableBlock(oc, start, end - start + 1);
1768 /* Copy exported symbols into the ObjectCode. */
1770 oc->n_symbols = hdr->NumberOfSymbols;
1771 oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
1772 "ocGetNames_PEi386(oc->symbols)");
1773 /* Call me paranoid; I don't care. */
1774 for (i = 0; i < oc->n_symbols; i++)
1775 oc->symbols[i] = NULL;
1779 COFF_symbol* symtab_i;
1780 if (i >= (Int32)(hdr->NumberOfSymbols)) break;
1781 symtab_i = (COFF_symbol*)
1782 myindex ( sizeof_COFF_symbol, symtab, i );
1786 if (symtab_i->StorageClass == MYIMAGE_SYM_CLASS_EXTERNAL
1787 && symtab_i->SectionNumber != MYIMAGE_SYM_UNDEFINED) {
1788 /* This symbol is global and defined, viz, exported */
1789 /* for MYIMAGE_SYMCLASS_EXTERNAL
1790 && !MYIMAGE_SYM_UNDEFINED,
1791 the address of the symbol is:
1792 address of relevant section + offset in section
1794 COFF_section* sectabent
1795 = (COFF_section*) myindex ( sizeof_COFF_section,
1797 symtab_i->SectionNumber-1 );
1798 addr = ((UChar*)(oc->image))
1799 + (sectabent->PointerToRawData
1803 if (symtab_i->SectionNumber == MYIMAGE_SYM_UNDEFINED
1804 && symtab_i->Value > 0) {
1805 /* This symbol isn't in any section at all, ie, global bss.
1806 Allocate zeroed space for it. */
1807 addr = stgCallocBytes(1, symtab_i->Value,
1808 "ocGetNames_PEi386(non-anonymous bss)");
1809 addSection(oc, SECTIONKIND_RWDATA, addr,
1810 ((UChar*)addr) + symtab_i->Value - 1);
1811 addProddableBlock(oc, addr, symtab_i->Value);
1812 /* fprintf(stderr, "BSS section at 0x%x\n", addr); */
1815 if (addr != NULL ) {
1816 sname = cstring_from_COFF_symbol_name ( symtab_i->Name, strtab );
1817 /* fprintf(stderr,"addSymbol %p `%s \n", addr,sname); */
1818 IF_DEBUG(linker, belch("addSymbol %p `%s'\n", addr,sname);)
1819 ASSERT(i >= 0 && i < oc->n_symbols);
1820 /* cstring_from_COFF_symbol_name always succeeds. */
1821 oc->symbols[i] = sname;
1822 ghciInsertStrHashTable(oc->fileName, symhash, sname, addr);
1826 "IGNORING symbol %d\n"
1830 printName ( symtab_i->Name, strtab );
1839 (Int32)(symtab_i->SectionNumber),
1840 (UInt32)symtab_i->Type,
1841 (UInt32)symtab_i->StorageClass,
1842 (UInt32)symtab_i->NumberOfAuxSymbols
1847 i += symtab_i->NumberOfAuxSymbols;
1856 ocResolve_PEi386 ( ObjectCode* oc )
1859 COFF_section* sectab;
1860 COFF_symbol* symtab;
1870 /* ToDo: should be variable-sized? But is at least safe in the
1871 sense of buffer-overrun-proof. */
1873 /* fprintf(stderr, "resolving for %s\n", oc->fileName); */
1875 hdr = (COFF_header*)(oc->image);
1876 sectab = (COFF_section*) (
1877 ((UChar*)(oc->image))
1878 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1880 symtab = (COFF_symbol*) (
1881 ((UChar*)(oc->image))
1882 + hdr->PointerToSymbolTable
1884 strtab = ((UChar*)(oc->image))
1885 + hdr->PointerToSymbolTable
1886 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
1888 for (i = 0; i < hdr->NumberOfSections; i++) {
1889 COFF_section* sectab_i
1891 myindex ( sizeof_COFF_section, sectab, i );
1894 ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
1897 /* Ignore sections called which contain stabs debugging
1899 if (0 == strcmp(".stab", sectab_i->Name)
1900 || 0 == strcmp(".stabstr", sectab_i->Name))
1903 if ( sectab_i->Characteristics & MYIMAGE_SCN_LNK_NRELOC_OVFL ) {
1904 /* If the relocation field (a short) has overflowed, the
1905 * real count can be found in the first reloc entry.
1907 * See Section 4.1 (last para) of the PE spec (rev6.0).
1909 COFF_reloc* rel = (COFF_reloc*)
1910 myindex ( sizeof_COFF_reloc, reltab, 0 );
1911 noRelocs = rel->VirtualAddress;
1912 fprintf(stderr, "Overflown relocs: %u\n", noRelocs);
1915 noRelocs = sectab_i->NumberOfRelocations;
1920 for (; j < noRelocs; j++) {
1922 COFF_reloc* reltab_j
1924 myindex ( sizeof_COFF_reloc, reltab, j );
1926 /* the location to patch */
1928 ((UChar*)(oc->image))
1929 + (sectab_i->PointerToRawData
1930 + reltab_j->VirtualAddress
1931 - sectab_i->VirtualAddress )
1933 /* the existing contents of pP */
1935 /* the symbol to connect to */
1936 sym = (COFF_symbol*)
1937 myindex ( sizeof_COFF_symbol,
1938 symtab, reltab_j->SymbolTableIndex );
1941 "reloc sec %2d num %3d: type 0x%-4x "
1942 "vaddr 0x%-8x name `",
1944 (UInt32)reltab_j->Type,
1945 reltab_j->VirtualAddress );
1946 printName ( sym->Name, strtab );
1947 fprintf ( stderr, "'\n" ));
1949 if (sym->StorageClass == MYIMAGE_SYM_CLASS_STATIC) {
1950 COFF_section* section_sym
1951 = findPEi386SectionCalled ( oc, sym->Name );
1953 belch("%s: can't find section `%s'", oc->fileName, sym->Name);
1956 S = ((UInt32)(oc->image))
1957 + (section_sym->PointerToRawData
1960 copyName ( sym->Name, strtab, symbol, 1000-1 );
1961 (void*)S = lookupLocalSymbol( oc, symbol );
1962 if ((void*)S != NULL) goto foundit;
1963 (void*)S = lookupSymbol( symbol );
1964 if ((void*)S != NULL) goto foundit;
1965 zapTrailingAtSign ( symbol );
1966 (void*)S = lookupLocalSymbol( oc, symbol );
1967 if ((void*)S != NULL) goto foundit;
1968 (void*)S = lookupSymbol( symbol );
1969 if ((void*)S != NULL) goto foundit;
1970 /* Newline first because the interactive linker has printed "linking..." */
1971 belch("\n%s: unknown symbol `%s'", oc->fileName, symbol);
1975 checkProddableBlock(oc, pP);
1976 switch (reltab_j->Type) {
1977 case MYIMAGE_REL_I386_DIR32:
1980 case MYIMAGE_REL_I386_REL32:
1981 /* Tricky. We have to insert a displacement at
1982 pP which, when added to the PC for the _next_
1983 insn, gives the address of the target (S).
1984 Problem is to know the address of the next insn
1985 when we only know pP. We assume that this
1986 literal field is always the last in the insn,
1987 so that the address of the next insn is pP+4
1988 -- hence the constant 4.
1989 Also I don't know if A should be added, but so
1990 far it has always been zero.
1993 *pP = S - ((UInt32)pP) - 4;
1996 belch("%s: unhandled PEi386 relocation type %d",
1997 oc->fileName, reltab_j->Type);
2004 IF_DEBUG(linker, belch("completed %s", oc->fileName));
2008 #endif /* defined(OBJFORMAT_PEi386) */
2011 /* --------------------------------------------------------------------------
2013 * ------------------------------------------------------------------------*/
2015 #if defined(OBJFORMAT_ELF)
2020 #if defined(sparc_TARGET_ARCH)
2021 # define ELF_TARGET_SPARC /* Used inside <elf.h> */
2022 #elif defined(i386_TARGET_ARCH)
2023 # define ELF_TARGET_386 /* Used inside <elf.h> */
2024 #elif defined(x86_64_TARGET_ARCH)
2025 # define ELF_TARGET_X64_64
2027 #elif defined (ia64_TARGET_ARCH)
2028 # define ELF_TARGET_IA64 /* Used inside <elf.h> */
2030 # define ELF_FUNCTION_DESC /* calling convention uses function descriptors */
2031 # define ELF_NEED_GOT /* needs Global Offset Table */
2032 # define ELF_NEED_PLT /* needs Procedure Linkage Tables */
2035 #if !defined(openbsd_TARGET_OS)
2038 /* openbsd elf has things in different places, with diff names */
2039 #include <elf_abi.h>
2040 #include <machine/reloc.h>
2041 #define R_386_32 RELOC_32
2042 #define R_386_PC32 RELOC_PC32
2046 * Define a set of types which can be used for both ELF32 and ELF64
2050 #define ELFCLASS ELFCLASS64
2051 #define Elf_Addr Elf64_Addr
2052 #define Elf_Word Elf64_Word
2053 #define Elf_Sword Elf64_Sword
2054 #define Elf_Ehdr Elf64_Ehdr
2055 #define Elf_Phdr Elf64_Phdr
2056 #define Elf_Shdr Elf64_Shdr
2057 #define Elf_Sym Elf64_Sym
2058 #define Elf_Rel Elf64_Rel
2059 #define Elf_Rela Elf64_Rela
2060 #define ELF_ST_TYPE ELF64_ST_TYPE
2061 #define ELF_ST_BIND ELF64_ST_BIND
2062 #define ELF_R_TYPE ELF64_R_TYPE
2063 #define ELF_R_SYM ELF64_R_SYM
2065 #define ELFCLASS ELFCLASS32
2066 #define Elf_Addr Elf32_Addr
2067 #define Elf_Word Elf32_Word
2068 #define Elf_Sword Elf32_Sword
2069 #define Elf_Ehdr Elf32_Ehdr
2070 #define Elf_Phdr Elf32_Phdr
2071 #define Elf_Shdr Elf32_Shdr
2072 #define Elf_Sym Elf32_Sym
2073 #define Elf_Rel Elf32_Rel
2074 #define Elf_Rela Elf32_Rela
2076 #define ELF_ST_TYPE ELF32_ST_TYPE
2079 #define ELF_ST_BIND ELF32_ST_BIND
2082 #define ELF_R_TYPE ELF32_R_TYPE
2085 #define ELF_R_SYM ELF32_R_SYM
2091 * Functions to allocate entries in dynamic sections. Currently we simply
2092 * preallocate a large number, and we don't check if a entry for the given
2093 * target already exists (a linear search is too slow). Ideally these
2094 * entries would be associated with symbols.
2097 /* These sizes sufficient to load HSbase + HShaskell98 + a few modules */
2098 #define GOT_SIZE 0x20000
2099 #define FUNCTION_TABLE_SIZE 0x10000
2100 #define PLT_SIZE 0x08000
2103 static Elf_Addr got[GOT_SIZE];
2104 static unsigned int gotIndex;
2105 static Elf_Addr gp_val = (Elf_Addr)got;
2108 allocateGOTEntry(Elf_Addr target)
2112 if (gotIndex >= GOT_SIZE)
2113 barf("Global offset table overflow");
2115 entry = &got[gotIndex++];
2117 return (Elf_Addr)entry;
2121 #ifdef ELF_FUNCTION_DESC
2127 static FunctionDesc functionTable[FUNCTION_TABLE_SIZE];
2128 static unsigned int functionTableIndex;
2131 allocateFunctionDesc(Elf_Addr target)
2133 FunctionDesc *entry;
2135 if (functionTableIndex >= FUNCTION_TABLE_SIZE)
2136 barf("Function table overflow");
2138 entry = &functionTable[functionTableIndex++];
2140 entry->gp = (Elf_Addr)gp_val;
2141 return (Elf_Addr)entry;
2145 copyFunctionDesc(Elf_Addr target)
2147 FunctionDesc *olddesc = (FunctionDesc *)target;
2148 FunctionDesc *newdesc;
2150 newdesc = (FunctionDesc *)allocateFunctionDesc(olddesc->ip);
2151 newdesc->gp = olddesc->gp;
2152 return (Elf_Addr)newdesc;
2157 #ifdef ia64_TARGET_ARCH
2158 static void ia64_reloc_gprel22(Elf_Addr target, Elf_Addr value);
2159 static void ia64_reloc_pcrel21(Elf_Addr target, Elf_Addr value, ObjectCode *oc);
2161 static unsigned char plt_code[] =
2163 /* taken from binutils bfd/elfxx-ia64.c */
2164 0x0b, 0x78, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r15=0,r1;; */
2165 0x00, 0x41, 0x3c, 0x30, 0x28, 0xc0, /* ld8 r16=[r15],8 */
2166 0x01, 0x08, 0x00, 0x84, /* mov r14=r1;; */
2167 0x11, 0x08, 0x00, 0x1e, 0x18, 0x10, /* [MIB] ld8 r1=[r15] */
2168 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */
2169 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */
2172 /* If we can't get to the function descriptor via gp, take a local copy of it */
2173 #define PLT_RELOC(code, target) { \
2174 Elf64_Sxword rel_value = target - gp_val; \
2175 if ((rel_value > 0x1fffff) || (rel_value < -0x1fffff)) \
2176 ia64_reloc_gprel22((Elf_Addr)code, copyFunctionDesc(target)); \
2178 ia64_reloc_gprel22((Elf_Addr)code, target); \
2183 unsigned char code[sizeof(plt_code)];
2187 allocatePLTEntry(Elf_Addr target, ObjectCode *oc)
2189 PLTEntry *plt = (PLTEntry *)oc->plt;
2192 if (oc->pltIndex >= PLT_SIZE)
2193 barf("Procedure table overflow");
2195 entry = &plt[oc->pltIndex++];
2196 memcpy(entry->code, plt_code, sizeof(entry->code));
2197 PLT_RELOC(entry->code, target);
2198 return (Elf_Addr)entry;
2204 return (PLT_SIZE * sizeof(PLTEntry));
2210 * Generic ELF functions
2214 findElfSection ( void* objImage, Elf_Word sh_type )
2216 char* ehdrC = (char*)objImage;
2217 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2218 Elf_Shdr* shdr = (Elf_Shdr*)(ehdrC + ehdr->e_shoff);
2219 char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
2223 for (i = 0; i < ehdr->e_shnum; i++) {
2224 if (shdr[i].sh_type == sh_type
2225 /* Ignore the section header's string table. */
2226 && i != ehdr->e_shstrndx
2227 /* Ignore string tables named .stabstr, as they contain
2229 && 0 != memcmp(".stabstr", sh_strtab + shdr[i].sh_name, 8)
2231 ptr = ehdrC + shdr[i].sh_offset;
2238 #if defined(ia64_TARGET_ARCH)
2240 findElfSegment ( void* objImage, Elf_Addr vaddr )
2242 char* ehdrC = (char*)objImage;
2243 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2244 Elf_Phdr* phdr = (Elf_Phdr*)(ehdrC + ehdr->e_phoff);
2245 Elf_Addr segaddr = 0;
2248 for (i = 0; i < ehdr->e_phnum; i++) {
2249 segaddr = phdr[i].p_vaddr;
2250 if ((vaddr >= segaddr) && (vaddr < segaddr + phdr[i].p_memsz))
2258 ocVerifyImage_ELF ( ObjectCode* oc )
2262 int i, j, nent, nstrtab, nsymtabs;
2266 char* ehdrC = (char*)(oc->image);
2267 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2269 if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
2270 ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
2271 ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
2272 ehdr->e_ident[EI_MAG3] != ELFMAG3) {
2273 belch("%s: not an ELF object", oc->fileName);
2277 if (ehdr->e_ident[EI_CLASS] != ELFCLASS) {
2278 belch("%s: unsupported ELF format", oc->fileName);
2282 if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
2283 IF_DEBUG(linker,belch( "Is little-endian" ));
2285 if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
2286 IF_DEBUG(linker,belch( "Is big-endian" ));
2288 belch("%s: unknown endiannness", oc->fileName);
2292 if (ehdr->e_type != ET_REL) {
2293 belch("%s: not a relocatable object (.o) file", oc->fileName);
2296 IF_DEBUG(linker, belch( "Is a relocatable object (.o) file" ));
2298 IF_DEBUG(linker,belch( "Architecture is " ));
2299 switch (ehdr->e_machine) {
2300 case EM_386: IF_DEBUG(linker,belch( "x86" )); break;
2301 case EM_SPARC: IF_DEBUG(linker,belch( "sparc" )); break;
2303 case EM_IA_64: IF_DEBUG(linker,belch( "ia64" )); break;
2305 default: IF_DEBUG(linker,belch( "unknown" ));
2306 belch("%s: unknown architecture", oc->fileName);
2310 IF_DEBUG(linker,belch(
2311 "\nSection header table: start %d, n_entries %d, ent_size %d",
2312 ehdr->e_shoff, ehdr->e_shnum, ehdr->e_shentsize ));
2314 ASSERT (ehdr->e_shentsize == sizeof(Elf_Shdr));
2316 shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
2318 if (ehdr->e_shstrndx == SHN_UNDEF) {
2319 belch("%s: no section header string table", oc->fileName);
2322 IF_DEBUG(linker,belch( "Section header string table is section %d",
2324 sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
2327 for (i = 0; i < ehdr->e_shnum; i++) {
2328 IF_DEBUG(linker,fprintf(stderr, "%2d: ", i ));
2329 IF_DEBUG(linker,fprintf(stderr, "type=%2d ", (int)shdr[i].sh_type ));
2330 IF_DEBUG(linker,fprintf(stderr, "size=%4d ", (int)shdr[i].sh_size ));
2331 IF_DEBUG(linker,fprintf(stderr, "offs=%4d ", (int)shdr[i].sh_offset ));
2332 IF_DEBUG(linker,fprintf(stderr, " (%p .. %p) ",
2333 ehdrC + shdr[i].sh_offset,
2334 ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1));
2336 if (shdr[i].sh_type == SHT_REL) {
2337 IF_DEBUG(linker,fprintf(stderr, "Rel " ));
2338 } else if (shdr[i].sh_type == SHT_RELA) {
2339 IF_DEBUG(linker,fprintf(stderr, "RelA " ));
2341 IF_DEBUG(linker,fprintf(stderr," "));
2344 IF_DEBUG(linker,fprintf(stderr, "sname=%s\n", sh_strtab + shdr[i].sh_name ));
2348 IF_DEBUG(linker,belch( "\nString tables" ));
2351 for (i = 0; i < ehdr->e_shnum; i++) {
2352 if (shdr[i].sh_type == SHT_STRTAB
2353 /* Ignore the section header's string table. */
2354 && i != ehdr->e_shstrndx
2355 /* Ignore string tables named .stabstr, as they contain
2357 && 0 != memcmp(".stabstr", sh_strtab + shdr[i].sh_name, 8)
2359 IF_DEBUG(linker,belch(" section %d is a normal string table", i ));
2360 strtab = ehdrC + shdr[i].sh_offset;
2365 belch("%s: no string tables, or too many", oc->fileName);
2370 IF_DEBUG(linker,belch( "\nSymbol tables" ));
2371 for (i = 0; i < ehdr->e_shnum; i++) {
2372 if (shdr[i].sh_type != SHT_SYMTAB) continue;
2373 IF_DEBUG(linker,belch( "section %d is a symbol table", i ));
2375 stab = (Elf_Sym*) (ehdrC + shdr[i].sh_offset);
2376 nent = shdr[i].sh_size / sizeof(Elf_Sym);
2377 IF_DEBUG(linker,belch( " number of entries is apparently %d (%d rem)",
2379 shdr[i].sh_size % sizeof(Elf_Sym)
2381 if (0 != shdr[i].sh_size % sizeof(Elf_Sym)) {
2382 belch("%s: non-integral number of symbol table entries", oc->fileName);
2385 for (j = 0; j < nent; j++) {
2386 IF_DEBUG(linker,fprintf(stderr, " %2d ", j ));
2387 IF_DEBUG(linker,fprintf(stderr, " sec=%-5d size=%-3d val=%5p ",
2388 (int)stab[j].st_shndx,
2389 (int)stab[j].st_size,
2390 (char*)stab[j].st_value ));
2392 IF_DEBUG(linker,fprintf(stderr, "type=" ));
2393 switch (ELF_ST_TYPE(stab[j].st_info)) {
2394 case STT_NOTYPE: IF_DEBUG(linker,fprintf(stderr, "notype " )); break;
2395 case STT_OBJECT: IF_DEBUG(linker,fprintf(stderr, "object " )); break;
2396 case STT_FUNC : IF_DEBUG(linker,fprintf(stderr, "func " )); break;
2397 case STT_SECTION: IF_DEBUG(linker,fprintf(stderr, "section" )); break;
2398 case STT_FILE: IF_DEBUG(linker,fprintf(stderr, "file " )); break;
2399 default: IF_DEBUG(linker,fprintf(stderr, "? " )); break;
2401 IF_DEBUG(linker,fprintf(stderr, " " ));
2403 IF_DEBUG(linker,fprintf(stderr, "bind=" ));
2404 switch (ELF_ST_BIND(stab[j].st_info)) {
2405 case STB_LOCAL : IF_DEBUG(linker,fprintf(stderr, "local " )); break;
2406 case STB_GLOBAL: IF_DEBUG(linker,fprintf(stderr, "global" )); break;
2407 case STB_WEAK : IF_DEBUG(linker,fprintf(stderr, "weak " )); break;
2408 default: IF_DEBUG(linker,fprintf(stderr, "? " )); break;
2410 IF_DEBUG(linker,fprintf(stderr, " " ));
2412 IF_DEBUG(linker,fprintf(stderr, "name=%s\n", strtab + stab[j].st_name ));
2416 if (nsymtabs == 0) {
2417 belch("%s: didn't find any symbol tables", oc->fileName);
2426 ocGetNames_ELF ( ObjectCode* oc )
2431 char* ehdrC = (char*)(oc->image);
2432 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
2433 char* strtab = findElfSection ( ehdrC, SHT_STRTAB );
2434 Elf_Shdr* shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
2436 ASSERT(symhash != NULL);
2439 belch("%s: no strtab", oc->fileName);
2444 for (i = 0; i < ehdr->e_shnum; i++) {
2445 /* Figure out what kind of section it is. Logic derived from
2446 Figure 1.14 ("Special Sections") of the ELF document
2447 ("Portable Formats Specification, Version 1.1"). */
2448 Elf_Shdr hdr = shdr[i];
2449 SectionKind kind = SECTIONKIND_OTHER;
2452 if (hdr.sh_type == SHT_PROGBITS
2453 && (hdr.sh_flags & SHF_ALLOC) && (hdr.sh_flags & SHF_EXECINSTR)) {
2454 /* .text-style section */
2455 kind = SECTIONKIND_CODE_OR_RODATA;
2458 if (hdr.sh_type == SHT_PROGBITS
2459 && (hdr.sh_flags & SHF_ALLOC) && (hdr.sh_flags & SHF_WRITE)) {
2460 /* .data-style section */
2461 kind = SECTIONKIND_RWDATA;
2464 if (hdr.sh_type == SHT_PROGBITS
2465 && (hdr.sh_flags & SHF_ALLOC) && !(hdr.sh_flags & SHF_WRITE)) {
2466 /* .rodata-style section */
2467 kind = SECTIONKIND_CODE_OR_RODATA;
2470 if (hdr.sh_type == SHT_NOBITS
2471 && (hdr.sh_flags & SHF_ALLOC) && (hdr.sh_flags & SHF_WRITE)) {
2472 /* .bss-style section */
2473 kind = SECTIONKIND_RWDATA;
2477 if (is_bss && shdr[i].sh_size > 0) {
2478 /* This is a non-empty .bss section. Allocate zeroed space for
2479 it, and set its .sh_offset field such that
2480 ehdrC + .sh_offset == addr_of_zeroed_space. */
2481 char* zspace = stgCallocBytes(1, shdr[i].sh_size,
2482 "ocGetNames_ELF(BSS)");
2483 shdr[i].sh_offset = ((char*)zspace) - ((char*)ehdrC);
2485 fprintf(stderr, "BSS section at 0x%x, size %d\n",
2486 zspace, shdr[i].sh_size);
2490 /* fill in the section info */
2491 if (kind != SECTIONKIND_OTHER && shdr[i].sh_size > 0) {
2492 addProddableBlock(oc, ehdrC + shdr[i].sh_offset, shdr[i].sh_size);
2493 addSection(oc, kind, ehdrC + shdr[i].sh_offset,
2494 ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1);
2497 if (shdr[i].sh_type != SHT_SYMTAB) continue;
2499 /* copy stuff into this module's object symbol table */
2500 stab = (Elf_Sym*) (ehdrC + shdr[i].sh_offset);
2501 nent = shdr[i].sh_size / sizeof(Elf_Sym);
2503 oc->n_symbols = nent;
2504 oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
2505 "ocGetNames_ELF(oc->symbols)");
2507 for (j = 0; j < nent; j++) {
2509 char isLocal = FALSE; /* avoids uninit-var warning */
2511 char* nm = strtab + stab[j].st_name;
2512 int secno = stab[j].st_shndx;
2514 /* Figure out if we want to add it; if so, set ad to its
2515 address. Otherwise leave ad == NULL. */
2517 if (secno == SHN_COMMON) {
2519 ad = stgCallocBytes(1, stab[j].st_size, "ocGetNames_ELF(COMMON)");
2521 fprintf(stderr, "COMMON symbol, size %d name %s\n",
2522 stab[j].st_size, nm);
2524 /* Pointless to do addProddableBlock() for this area,
2525 since the linker should never poke around in it. */
2528 if ( ( ELF_ST_BIND(stab[j].st_info)==STB_GLOBAL
2529 || ELF_ST_BIND(stab[j].st_info)==STB_LOCAL
2531 /* and not an undefined symbol */
2532 && stab[j].st_shndx != SHN_UNDEF
2533 /* and not in a "special section" */
2534 && stab[j].st_shndx < SHN_LORESERVE
2536 /* and it's a not a section or string table or anything silly */
2537 ( ELF_ST_TYPE(stab[j].st_info)==STT_FUNC ||
2538 ELF_ST_TYPE(stab[j].st_info)==STT_OBJECT ||
2539 ELF_ST_TYPE(stab[j].st_info)==STT_NOTYPE
2542 /* Section 0 is the undefined section, hence > and not >=. */
2543 ASSERT(secno > 0 && secno < ehdr->e_shnum);
2545 if (shdr[secno].sh_type == SHT_NOBITS) {
2546 fprintf(stderr, " BSS symbol, size %d off %d name %s\n",
2547 stab[j].st_size, stab[j].st_value, nm);
2550 ad = ehdrC + shdr[ secno ].sh_offset + stab[j].st_value;
2551 if (ELF_ST_BIND(stab[j].st_info)==STB_LOCAL) {
2554 #ifdef ELF_FUNCTION_DESC
2555 /* dlsym() and the initialisation table both give us function
2556 * descriptors, so to be consistent we store function descriptors
2557 * in the symbol table */
2558 if (ELF_ST_TYPE(stab[j].st_info) == STT_FUNC)
2559 ad = (char *)allocateFunctionDesc((Elf_Addr)ad);
2561 IF_DEBUG(linker,belch( "addOTabName(GLOB): %10p %s %s",
2562 ad, oc->fileName, nm ));
2567 /* And the decision is ... */
2571 oc->symbols[j] = nm;
2574 /* Ignore entirely. */
2576 ghciInsertStrHashTable(oc->fileName, symhash, nm, ad);
2580 IF_DEBUG(linker,belch( "skipping `%s'",
2581 strtab + stab[j].st_name ));
2584 "skipping bind = %d, type = %d, shndx = %d `%s'\n",
2585 (int)ELF_ST_BIND(stab[j].st_info),
2586 (int)ELF_ST_TYPE(stab[j].st_info),
2587 (int)stab[j].st_shndx,
2588 strtab + stab[j].st_name
2591 oc->symbols[j] = NULL;
2600 /* Do ELF relocations which lack an explicit addend. All x86-linux
2601 relocations appear to be of this form. */
2603 do_Elf_Rel_relocations ( ObjectCode* oc, char* ehdrC,
2604 Elf_Shdr* shdr, int shnum,
2605 Elf_Sym* stab, char* strtab )
2610 Elf_Rel* rtab = (Elf_Rel*) (ehdrC + shdr[shnum].sh_offset);
2611 int nent = shdr[shnum].sh_size / sizeof(Elf_Rel);
2612 int target_shndx = shdr[shnum].sh_info;
2613 int symtab_shndx = shdr[shnum].sh_link;
2615 stab = (Elf_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
2616 targ = (Elf_Word*)(ehdrC + shdr[ target_shndx ].sh_offset);
2617 IF_DEBUG(linker,belch( "relocations for section %d using symtab %d",
2618 target_shndx, symtab_shndx ));
2620 for (j = 0; j < nent; j++) {
2621 Elf_Addr offset = rtab[j].r_offset;
2622 Elf_Addr info = rtab[j].r_info;
2624 Elf_Addr P = ((Elf_Addr)targ) + offset;
2625 Elf_Word* pP = (Elf_Word*)P;
2630 IF_DEBUG(linker,belch( "Rel entry %3d is raw(%6p %6p)",
2631 j, (void*)offset, (void*)info ));
2633 IF_DEBUG(linker,belch( " ZERO" ));
2636 Elf_Sym sym = stab[ELF_R_SYM(info)];
2637 /* First see if it is a local symbol. */
2638 if (ELF_ST_BIND(sym.st_info) == STB_LOCAL) {
2639 /* Yes, so we can get the address directly from the ELF symbol
2641 symbol = sym.st_name==0 ? "(noname)" : strtab+sym.st_name;
2643 (ehdrC + shdr[ sym.st_shndx ].sh_offset
2644 + stab[ELF_R_SYM(info)].st_value);
2647 /* No, so look up the name in our global table. */
2648 symbol = strtab + sym.st_name;
2649 (void*)S = lookupSymbol( symbol );
2652 belch("%s: unknown symbol `%s'", oc->fileName, symbol);
2655 IF_DEBUG(linker,belch( "`%s' resolves to %p", symbol, (void*)S ));
2658 IF_DEBUG(linker,belch( "Reloc: P = %p S = %p A = %p",
2659 (void*)P, (void*)S, (void*)A ));
2660 checkProddableBlock ( oc, pP );
2664 switch (ELF_R_TYPE(info)) {
2665 # ifdef i386_TARGET_ARCH
2666 case R_386_32: *pP = value; break;
2667 case R_386_PC32: *pP = value - P; break;
2670 belch("%s: unhandled ELF relocation(Rel) type %d\n",
2671 oc->fileName, ELF_R_TYPE(info));
2679 /* Do ELF relocations for which explicit addends are supplied.
2680 sparc-solaris relocations appear to be of this form. */
2682 do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
2683 Elf_Shdr* shdr, int shnum,
2684 Elf_Sym* stab, char* strtab )
2689 Elf_Rela* rtab = (Elf_Rela*) (ehdrC + shdr[shnum].sh_offset);
2690 int nent = shdr[shnum].sh_size / sizeof(Elf_Rela);
2691 int target_shndx = shdr[shnum].sh_info;
2692 int symtab_shndx = shdr[shnum].sh_link;
2694 stab = (Elf_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
2695 targ = (Elf_Addr) (ehdrC + shdr[ target_shndx ].sh_offset);
2696 IF_DEBUG(linker,belch( "relocations for section %d using symtab %d",
2697 target_shndx, symtab_shndx ));
2699 for (j = 0; j < nent; j++) {
2700 #if defined(DEBUG) || defined(sparc_TARGET_ARCH) || defined(ia64_TARGET_ARCH)
2701 /* This #ifdef only serves to avoid unused-var warnings. */
2702 Elf_Addr offset = rtab[j].r_offset;
2703 Elf_Addr P = targ + offset;
2705 Elf_Addr info = rtab[j].r_info;
2706 Elf_Addr A = rtab[j].r_addend;
2709 # if defined(sparc_TARGET_ARCH)
2710 Elf_Word* pP = (Elf_Word*)P;
2712 # elif defined(ia64_TARGET_ARCH)
2713 Elf64_Xword *pP = (Elf64_Xword *)P;
2717 IF_DEBUG(linker,belch( "Rel entry %3d is raw(%6p %6p %6p) ",
2718 j, (void*)offset, (void*)info,
2721 IF_DEBUG(linker,belch( " ZERO" ));
2724 Elf_Sym sym = stab[ELF_R_SYM(info)];
2725 /* First see if it is a local symbol. */
2726 if (ELF_ST_BIND(sym.st_info) == STB_LOCAL) {
2727 /* Yes, so we can get the address directly from the ELF symbol
2729 symbol = sym.st_name==0 ? "(noname)" : strtab+sym.st_name;
2731 (ehdrC + shdr[ sym.st_shndx ].sh_offset
2732 + stab[ELF_R_SYM(info)].st_value);
2733 #ifdef ELF_FUNCTION_DESC
2734 /* Make a function descriptor for this function */
2735 if (S && ELF_ST_TYPE(sym.st_info) == STT_FUNC) {
2736 S = allocateFunctionDesc(S + A);
2741 /* No, so look up the name in our global table. */
2742 symbol = strtab + sym.st_name;
2743 (void*)S = lookupSymbol( symbol );
2745 #ifdef ELF_FUNCTION_DESC
2746 /* If a function, already a function descriptor - we would
2747 have to copy it to add an offset. */
2748 if (S && (ELF_ST_TYPE(sym.st_info) == STT_FUNC) && (A != 0))
2749 belch("%s: function %s with addend %p", oc->fileName, symbol, (void *)A);
2753 belch("%s: unknown symbol `%s'", oc->fileName, symbol);
2756 IF_DEBUG(linker,belch( "`%s' resolves to %p", symbol, (void*)S ));
2759 IF_DEBUG(linker,fprintf ( stderr, "Reloc: P = %p S = %p A = %p\n",
2760 (void*)P, (void*)S, (void*)A ));
2761 /* checkProddableBlock ( oc, (void*)P ); */
2765 switch (ELF_R_TYPE(info)) {
2766 # if defined(sparc_TARGET_ARCH)
2767 case R_SPARC_WDISP30:
2768 w1 = *pP & 0xC0000000;
2769 w2 = (Elf_Word)((value - P) >> 2);
2770 ASSERT((w2 & 0xC0000000) == 0);
2775 w1 = *pP & 0xFFC00000;
2776 w2 = (Elf_Word)(value >> 10);
2777 ASSERT((w2 & 0xFFC00000) == 0);
2783 w2 = (Elf_Word)(value & 0x3FF);
2784 ASSERT((w2 & ~0x3FF) == 0);
2788 /* According to the Sun documentation:
2790 This relocation type resembles R_SPARC_32, except it refers to an
2791 unaligned word. That is, the word to be relocated must be treated
2792 as four separate bytes with arbitrary alignment, not as a word
2793 aligned according to the architecture requirements.
2795 (JRS: which means that freeloading on the R_SPARC_32 case
2796 is probably wrong, but hey ...)
2800 w2 = (Elf_Word)value;
2803 # elif defined(ia64_TARGET_ARCH)
2804 case R_IA64_DIR64LSB:
2805 case R_IA64_FPTR64LSB:
2808 case R_IA64_PCREL64LSB:
2811 case R_IA64_SEGREL64LSB:
2812 addr = findElfSegment(ehdrC, value);
2815 case R_IA64_GPREL22:
2816 ia64_reloc_gprel22(P, value);
2818 case R_IA64_LTOFF22:
2819 case R_IA64_LTOFF22X:
2820 case R_IA64_LTOFF_FPTR22:
2821 addr = allocateGOTEntry(value);
2822 ia64_reloc_gprel22(P, addr);
2824 case R_IA64_PCREL21B:
2825 ia64_reloc_pcrel21(P, S, oc);
2828 /* This goes with R_IA64_LTOFF22X and points to the load to
2829 * convert into a move. We don't implement relaxation. */
2833 belch("%s: unhandled ELF relocation(RelA) type %d\n",
2834 oc->fileName, ELF_R_TYPE(info));
2843 ocResolve_ELF ( ObjectCode* oc )
2847 Elf_Sym* stab = NULL;
2848 char* ehdrC = (char*)(oc->image);
2849 Elf_Ehdr* ehdr = (Elf_Ehdr*) ehdrC;
2850 Elf_Shdr* shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
2851 char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
2853 /* first find "the" symbol table */
2854 stab = (Elf_Sym*) findElfSection ( ehdrC, SHT_SYMTAB );
2856 /* also go find the string table */
2857 strtab = findElfSection ( ehdrC, SHT_STRTAB );
2859 if (stab == NULL || strtab == NULL) {
2860 belch("%s: can't find string or symbol table", oc->fileName);
2864 /* Process the relocation sections. */
2865 for (shnum = 0; shnum < ehdr->e_shnum; shnum++) {
2867 /* Skip sections called ".rel.stab". These appear to contain
2868 relocation entries that, when done, make the stabs debugging
2869 info point at the right places. We ain't interested in all
2871 if (0 == memcmp(".rel.stab", sh_strtab + shdr[shnum].sh_name, 9))
2874 if (shdr[shnum].sh_type == SHT_REL ) {
2875 ok = do_Elf_Rel_relocations ( oc, ehdrC, shdr,
2876 shnum, stab, strtab );
2880 if (shdr[shnum].sh_type == SHT_RELA) {
2881 ok = do_Elf_Rela_relocations ( oc, ehdrC, shdr,
2882 shnum, stab, strtab );
2887 /* Free the local symbol table; we won't need it again. */
2888 freeHashTable(oc->lochash, NULL);
2896 * Instructions are 41 bits long, packed into 128 bit bundles with a 5-bit template
2897 * at the front. The following utility functions pack and unpack instructions, and
2898 * take care of the most common relocations.
2901 #ifdef ia64_TARGET_ARCH
2904 ia64_extract_instruction(Elf64_Xword *target)
2907 int slot = (Elf_Addr)target & 3;
2908 (Elf_Addr)target &= ~3;
2916 return ((w1 >> 5) & 0x1ffffffffff);
2918 return (w1 >> 46) | ((w2 & 0x7fffff) << 18);
2922 barf("ia64_extract_instruction: invalid slot %p", target);
2927 ia64_deposit_instruction(Elf64_Xword *target, Elf64_Xword value)
2929 int slot = (Elf_Addr)target & 3;
2930 (Elf_Addr)target &= ~3;
2935 *target |= value << 5;
2938 *target |= value << 46;
2939 *(target+1) |= value >> 18;
2942 *(target+1) |= value << 23;
2948 ia64_reloc_gprel22(Elf_Addr target, Elf_Addr value)
2950 Elf64_Xword instruction;
2951 Elf64_Sxword rel_value;
2953 rel_value = value - gp_val;
2954 if ((rel_value > 0x1fffff) || (rel_value < -0x1fffff))
2955 barf("GP-relative data out of range (address = 0x%lx, gp = 0x%lx)", value, gp_val);
2957 instruction = ia64_extract_instruction((Elf64_Xword *)target);
2958 instruction |= (((rel_value >> 0) & 0x07f) << 13) /* imm7b */
2959 | (((rel_value >> 7) & 0x1ff) << 27) /* imm9d */
2960 | (((rel_value >> 16) & 0x01f) << 22) /* imm5c */
2961 | ((Elf64_Xword)(rel_value < 0) << 36); /* s */
2962 ia64_deposit_instruction((Elf64_Xword *)target, instruction);
2966 ia64_reloc_pcrel21(Elf_Addr target, Elf_Addr value, ObjectCode *oc)
2968 Elf64_Xword instruction;
2969 Elf64_Sxword rel_value;
2972 entry = allocatePLTEntry(value, oc);
2974 rel_value = (entry >> 4) - (target >> 4);
2975 if ((rel_value > 0xfffff) || (rel_value < -0xfffff))
2976 barf("PLT entry too far away (entry = 0x%lx, target = 0x%lx)", entry, target);
2978 instruction = ia64_extract_instruction((Elf64_Xword *)target);
2979 instruction |= ((rel_value & 0xfffff) << 13) /* imm20b */
2980 | ((Elf64_Xword)(rel_value < 0) << 36); /* s */
2981 ia64_deposit_instruction((Elf64_Xword *)target, instruction);
2988 /* --------------------------------------------------------------------------
2990 * ------------------------------------------------------------------------*/
2992 #if defined(OBJFORMAT_MACHO)
2995 Initial support for MachO linking on Darwin/MacOS X on PowerPC chips
2996 by Wolfgang Thaller (wolfgang.thaller@gmx.net)
2998 I hereby formally apologize for the hackish nature of this code.
2999 Things that need to be done:
3000 *) get common symbols and .bss sections to work properly.
3001 Haskell modules seem to work, but C modules can cause problems
3002 *) implement ocVerifyImage_MachO
3003 *) add more sanity checks. The current code just has to segfault if there's a
3007 static int ocVerifyImage_MachO(ObjectCode* oc)
3009 // FIXME: do some verifying here
3013 static int resolveImports(
3016 struct symtab_command *symLC,
3017 struct section *sect, // ptr to lazy or non-lazy symbol pointer section
3018 unsigned long *indirectSyms,
3019 struct nlist *nlist)
3023 for(i=0;i*4<sect->size;i++)
3025 // according to otool, reserved1 contains the first index into the indirect symbol table
3026 struct nlist *symbol = &nlist[indirectSyms[sect->reserved1+i]];
3027 char *nm = image + symLC->stroff + symbol->n_un.n_strx;
3030 if((symbol->n_type & N_TYPE) == N_UNDF
3031 && (symbol->n_type & N_EXT) && (symbol->n_value != 0))
3032 addr = (void*) (symbol->n_value);
3033 else if((addr = lookupLocalSymbol(oc,nm)) != NULL)
3036 addr = lookupSymbol(nm);
3039 belch("\n%s: unknown symbol `%s'", oc->fileName, nm);
3043 checkProddableBlock(oc,((void**)(image + sect->offset)) + i);
3044 ((void**)(image + sect->offset))[i] = addr;
3050 static int relocateSection(
3053 struct symtab_command *symLC, struct nlist *nlist,
3054 struct section* sections, struct section *sect)
3056 struct relocation_info *relocs;
3059 if(!strcmp(sect->sectname,"__la_symbol_ptr"))
3061 else if(!strcmp(sect->sectname,"__nl_symbol_ptr"))
3065 relocs = (struct relocation_info*) (image + sect->reloff);
3069 if(relocs[i].r_address & R_SCATTERED)
3071 struct scattered_relocation_info *scat =
3072 (struct scattered_relocation_info*) &relocs[i];
3076 if(scat->r_length == 2 && scat->r_type == GENERIC_RELOC_VANILLA)
3078 unsigned long* word = (unsigned long*) (image + sect->offset + scat->r_address);
3080 checkProddableBlock(oc,word);
3081 *word = scat->r_value + sect->offset + ((long) image);
3085 continue; // FIXME: I hope it's OK to ignore all the others.
3089 struct relocation_info *reloc = &relocs[i];
3090 if(reloc->r_pcrel && !reloc->r_extern)
3093 if(reloc->r_length == 2)
3095 unsigned long word = 0;
3097 unsigned long* wordPtr = (unsigned long*) (image + sect->offset + reloc->r_address);
3098 checkProddableBlock(oc,wordPtr);
3100 if(reloc->r_type == GENERIC_RELOC_VANILLA)
3104 else if(reloc->r_type == PPC_RELOC_LO16)
3106 word = ((unsigned short*) wordPtr)[1];
3107 word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF) << 16;
3109 else if(reloc->r_type == PPC_RELOC_HI16)
3111 word = ((unsigned short*) wordPtr)[1] << 16;
3112 word |= ((unsigned long) relocs[i+1].r_address & 0xFFFF);
3114 else if(reloc->r_type == PPC_RELOC_HA16)
3116 word = ((unsigned short*) wordPtr)[1] << 16;
3117 word += ((short)relocs[i+1].r_address & (short)0xFFFF);
3119 else if(reloc->r_type == PPC_RELOC_BR24)
3122 word = (word & 0x03FFFFFC) | (word & 0x02000000) ? 0xFC000000 : 0;
3126 if(!reloc->r_extern)
3129 sections[reloc->r_symbolnum-1].offset
3130 - sections[reloc->r_symbolnum-1].addr
3137 struct nlist *symbol = &nlist[reloc->r_symbolnum];
3138 char *nm = image + symLC->stroff + symbol->n_un.n_strx;
3139 word = (unsigned long) (lookupSymbol(nm));
3142 belch("\nunknown symbol `%s'", nm);
3147 word -= ((long)image) + sect->offset + reloc->r_address;
3150 if(reloc->r_type == GENERIC_RELOC_VANILLA)
3155 else if(reloc->r_type == PPC_RELOC_LO16)
3157 ((unsigned short*) wordPtr)[1] = word & 0xFFFF;
3160 else if(reloc->r_type == PPC_RELOC_HI16)
3162 ((unsigned short*) wordPtr)[1] = (word >> 16) & 0xFFFF;
3165 else if(reloc->r_type == PPC_RELOC_HA16)
3167 ((unsigned short*) wordPtr)[1] = ((word >> 16) & 0xFFFF)
3168 + ((word & (1<<15)) ? 1 : 0);
3171 else if(reloc->r_type == PPC_RELOC_BR24)
3173 *wordPtr = (*wordPtr & 0xFC000003) | (word & 0x03FFFFFC);
3177 barf("\nunknown relocation %d",reloc->r_type);
3184 static int ocGetNames_MachO(ObjectCode* oc)
3186 char *image = (char*) oc->image;
3187 struct mach_header *header = (struct mach_header*) image;
3188 struct load_command *lc = (struct load_command*) (image + sizeof(struct mach_header));
3189 unsigned i,curSymbol;
3190 struct segment_command *segLC = NULL;
3191 struct section *sections, *la_ptrs = NULL, *nl_ptrs = NULL;
3192 struct symtab_command *symLC = NULL;
3193 struct dysymtab_command *dsymLC = NULL;
3194 struct nlist *nlist;
3195 unsigned long commonSize = 0;
3196 char *commonStorage = NULL;
3197 unsigned long commonCounter;
3199 for(i=0;i<header->ncmds;i++)
3201 if(lc->cmd == LC_SEGMENT)
3202 segLC = (struct segment_command*) lc;
3203 else if(lc->cmd == LC_SYMTAB)
3204 symLC = (struct symtab_command*) lc;
3205 else if(lc->cmd == LC_DYSYMTAB)
3206 dsymLC = (struct dysymtab_command*) lc;
3207 lc = (struct load_command *) ( ((char*)lc) + lc->cmdsize );
3210 sections = (struct section*) (segLC+1);
3211 nlist = (struct nlist*) (image + symLC->symoff);
3213 for(i=0;i<segLC->nsects;i++)
3215 if(!strcmp(sections[i].sectname,"__la_symbol_ptr"))
3216 la_ptrs = §ions[i];
3217 else if(!strcmp(sections[i].sectname,"__nl_symbol_ptr"))
3218 nl_ptrs = §ions[i];
3220 // for now, only add __text and __const to the sections table
3221 else if(!strcmp(sections[i].sectname,"__text"))
3222 addSection(oc, SECTIONKIND_CODE_OR_RODATA,
3223 (void*) (image + sections[i].offset),
3224 (void*) (image + sections[i].offset + sections[i].size));
3225 else if(!strcmp(sections[i].sectname,"__const"))
3226 addSection(oc, SECTIONKIND_RWDATA,
3227 (void*) (image + sections[i].offset),
3228 (void*) (image + sections[i].offset + sections[i].size));
3229 else if(!strcmp(sections[i].sectname,"__data"))
3230 addSection(oc, SECTIONKIND_RWDATA,
3231 (void*) (image + sections[i].offset),
3232 (void*) (image + sections[i].offset + sections[i].size));
3234 if(sections[i].size > 0) // size 0 segments do exist
3235 addProddableBlock(oc, (void*) (image + sections[i].offset),
3239 // count external symbols defined here
3241 for(i=dsymLC->iextdefsym;i<dsymLC->iextdefsym+dsymLC->nextdefsym;i++)
3243 if((nlist[i].n_type & N_TYPE) == N_SECT)
3246 for(i=0;i<symLC->nsyms;i++)
3248 if((nlist[i].n_type & N_TYPE) == N_UNDF
3249 && (nlist[i].n_type & N_EXT) && (nlist[i].n_value != 0))
3251 commonSize += nlist[i].n_value;
3255 oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
3256 "ocGetNames_MachO(oc->symbols)");
3258 // insert symbols into hash table
3259 for(i=dsymLC->iextdefsym,curSymbol=0;i<dsymLC->iextdefsym+dsymLC->nextdefsym;i++)
3261 if((nlist[i].n_type & N_TYPE) == N_SECT)
3263 char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
3264 ghciInsertStrHashTable(oc->fileName, symhash, nm, image +
3265 sections[nlist[i].n_sect-1].offset
3266 - sections[nlist[i].n_sect-1].addr
3267 + nlist[i].n_value);
3268 oc->symbols[curSymbol++] = nm;
3272 // insert local symbols into lochash
3273 for(i=dsymLC->ilocalsym;i<dsymLC->ilocalsym+dsymLC->nlocalsym;i++)
3275 if((nlist[i].n_type & N_TYPE) == N_SECT)
3277 char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
3278 ghciInsertStrHashTable(oc->fileName, oc->lochash, nm, image +
3279 sections[nlist[i].n_sect-1].offset
3280 - sections[nlist[i].n_sect-1].addr
3281 + nlist[i].n_value);
3286 commonStorage = stgCallocBytes(1,commonSize,"ocGetNames_MachO(common symbols)");
3287 commonCounter = (unsigned long)commonStorage;
3288 for(i=0;i<symLC->nsyms;i++)
3290 if((nlist[i].n_type & N_TYPE) == N_UNDF
3291 && (nlist[i].n_type & N_EXT) && (nlist[i].n_value != 0))
3293 char *nm = image + symLC->stroff + nlist[i].n_un.n_strx;
3294 unsigned long sz = nlist[i].n_value;
3296 nlist[i].n_value = commonCounter;
3298 ghciInsertStrHashTable(oc->fileName, symhash, nm, (void*)commonCounter);
3299 oc->symbols[curSymbol++] = nm;
3301 commonCounter += sz;
3307 static int ocResolve_MachO(ObjectCode* oc)
3309 char *image = (char*) oc->image;
3310 struct mach_header *header = (struct mach_header*) image;
3311 struct load_command *lc = (struct load_command*) (image + sizeof(struct mach_header));
3313 struct segment_command *segLC = NULL;
3314 struct section *sections, *la_ptrs = NULL, *nl_ptrs = NULL;
3315 struct symtab_command *symLC = NULL;
3316 struct dysymtab_command *dsymLC = NULL;
3317 struct nlist *nlist;
3318 unsigned long *indirectSyms;
3320 for(i=0;i<header->ncmds;i++)
3322 if(lc->cmd == LC_SEGMENT)
3323 segLC = (struct segment_command*) lc;
3324 else if(lc->cmd == LC_SYMTAB)
3325 symLC = (struct symtab_command*) lc;
3326 else if(lc->cmd == LC_DYSYMTAB)
3327 dsymLC = (struct dysymtab_command*) lc;
3328 lc = (struct load_command *) ( ((char*)lc) + lc->cmdsize );
3331 sections = (struct section*) (segLC+1);
3332 nlist = (struct nlist*) (image + symLC->symoff);
3334 for(i=0;i<segLC->nsects;i++)
3336 if(!strcmp(sections[i].sectname,"__la_symbol_ptr"))
3337 la_ptrs = §ions[i];
3338 else if(!strcmp(sections[i].sectname,"__nl_symbol_ptr"))
3339 nl_ptrs = §ions[i];
3342 indirectSyms = (unsigned long*) (image + dsymLC->indirectsymoff);
3345 if(!resolveImports(oc,image,symLC,la_ptrs,indirectSyms,nlist))
3348 if(!resolveImports(oc,image,symLC,nl_ptrs,indirectSyms,nlist))
3351 for(i=0;i<segLC->nsects;i++)
3353 if(!relocateSection(oc,image,symLC,nlist,sections,§ions[i]))
3357 /* Free the local symbol table; we won't need it again. */
3358 freeHashTable(oc->lochash, NULL);
3364 * The Mach-O object format uses leading underscores. But not everywhere.
3365 * There is a small number of runtime support functions defined in
3366 * libcc_dynamic.a whose name does not have a leading underscore.
3367 * As a consequence, we can't get their address from C code.
3368 * We have to use inline assembler just to take the address of a function.
3372 static void machoInitSymbolsWithoutUnderscore()
3378 __asm__ ("lis %0,hi16(" #x ")\n\tori %0,%0,lo16(" #x ")" : "=r" (p)); \
3379 ghciInsertStrHashTable("(GHCi built-in symbols)", symhash, #x, p);
3381 RTS_MACHO_NOUNDERLINE_SYMBOLS