1 /* -----------------------------------------------------------------------------
2 * $Id: Linker.c,v 1.42 2001/05/18 21:18:17 qrczak Exp $
4 * (c) The GHC Team, 2000
8 * ---------------------------------------------------------------------------*/
15 #include "LinkerInternals.h"
17 #include "StoragePriv.h"
19 #ifdef HAVE_SYS_TYPES_H
20 #include <sys/types.h>
23 #ifdef HAVE_SYS_STAT_H
31 #if defined(linux_TARGET_OS) || defined(solaris2_TARGET_OS) || defined(freebsd_TARGET_OS)
32 # define OBJFORMAT_ELF
33 #elif defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS)
34 # define OBJFORMAT_PEi386
38 /* Hash table mapping symbol names to Symbol */
39 /*Str*/HashTable *symhash;
41 #if defined(OBJFORMAT_ELF)
42 static int ocVerifyImage_ELF ( ObjectCode* oc );
43 static int ocGetNames_ELF ( ObjectCode* oc );
44 static int ocResolve_ELF ( ObjectCode* oc );
45 #elif defined(OBJFORMAT_PEi386)
46 static int ocVerifyImage_PEi386 ( ObjectCode* oc );
47 static int ocGetNames_PEi386 ( ObjectCode* oc );
48 static int ocResolve_PEi386 ( ObjectCode* oc );
51 /* -----------------------------------------------------------------------------
52 * Built-in symbols from the RTS
55 typedef struct _RtsSymbolVal {
62 #define Maybe_ForeignObj SymX(mkForeignObjzh_fast)
64 #define Maybe_Stable_Names SymX(mkWeakzh_fast) \
65 SymX(makeStableNamezh_fast) \
66 SymX(finalizzeWeakzh_fast)
68 /* These are not available in GUM!!! -- HWL */
69 #define Maybe_ForeignObj
70 #define Maybe_Stable_Names
73 #if !defined (mingw32_TARGET_OS)
75 #define RTS_POSIX_ONLY_SYMBOLS \
76 SymX(stg_sig_install) \
78 #define RTS_MINGW_ONLY_SYMBOLS /**/
82 #define RTS_POSIX_ONLY_SYMBOLS
83 #define RTS_MINGW_ONLY_SYMBOLS \
109 Sym(PrelHandle_stderr_closure) \
110 Sym(Main_main_closure) \
133 Sym(_imp___timezone) \
135 SymX(GetProcessTimes) \
136 SymX(GetCurrentProcess) \
147 #define RTS_SYMBOLS \
149 Sym(stg_gc_enter_1) \
156 Sym(stg_gc_unpt_r1) \
157 Sym(stg_gc_unbx_r1) \
162 SymX(stg_update_PAP) \
163 SymX(stg_ap_1_upd_info) \
164 SymX(stg_ap_2_upd_info) \
165 SymX(stg_ap_3_upd_info) \
166 SymX(stg_ap_4_upd_info) \
167 SymX(stg_ap_5_upd_info) \
168 SymX(stg_ap_6_upd_info) \
169 SymX(stg_ap_7_upd_info) \
170 SymX(stg_ap_8_upd_info) \
171 SymX(stg_sel_0_upd_info) \
172 SymX(stg_sel_1_upd_info) \
173 SymX(stg_sel_2_upd_info) \
174 SymX(stg_sel_3_upd_info) \
175 SymX(stg_sel_4_upd_info) \
176 SymX(stg_sel_5_upd_info) \
177 SymX(stg_sel_6_upd_info) \
178 SymX(stg_sel_7_upd_info) \
179 SymX(stg_sel_8_upd_info) \
180 SymX(stg_sel_9_upd_info) \
181 SymX(stg_sel_10_upd_info) \
182 SymX(stg_sel_11_upd_info) \
183 SymX(stg_sel_12_upd_info) \
184 SymX(stg_sel_13_upd_info) \
185 SymX(stg_sel_14_upd_info) \
186 SymX(stg_sel_15_upd_info) \
187 SymX(stg_upd_frame_info) \
188 SymX(stg_seq_frame_info) \
189 SymX(stg_CAF_BLACKHOLE_info) \
190 SymX(stg_IND_STATIC_info) \
191 SymX(stg_EMPTY_MVAR_info) \
192 SymX(stg_MUT_ARR_PTRS_FROZEN_info) \
193 SymX(stg_WEAK_info) \
194 SymX(stg_CHARLIKE_closure) \
195 SymX(stg_INTLIKE_closure) \
197 SymX(newBCOzh_fast) \
198 SymX(mkApUpd0zh_fast) \
199 SymX(putMVarzh_fast) \
200 SymX(newMVarzh_fast) \
201 SymX(takeMVarzh_fast) \
202 SymX(tryTakeMVarzh_fast) \
203 SymX(tryPutMVarzh_fast) \
209 SymX(killThreadzh_fast) \
210 SymX(waitReadzh_fast) \
211 SymX(waitWritezh_fast) \
212 SymX(suspendThread) \
214 SymX(stackOverflow) \
215 SymX(int2Integerzh_fast) \
216 SymX(word2Integerzh_fast) \
218 SymX(__encodeDouble) \
219 SymX(decodeDoublezh_fast) \
220 SymX(decodeFloatzh_fast) \
221 SymX(gcdIntegerzh_fast) \
222 SymX(newArrayzh_fast) \
223 SymX(unsafeThawArrayzh_fast) \
224 SymX(newByteArrayzh_fast) \
225 SymX(newMutVarzh_fast) \
226 SymX(quotRemIntegerzh_fast) \
227 SymX(quotIntegerzh_fast) \
228 SymX(remIntegerzh_fast) \
229 SymX(divExactIntegerzh_fast) \
230 SymX(divModIntegerzh_fast) \
231 SymX(timesIntegerzh_fast) \
232 SymX(minusIntegerzh_fast) \
233 SymX(plusIntegerzh_fast) \
234 SymX(andIntegerzh_fast) \
235 SymX(orIntegerzh_fast) \
236 SymX(xorIntegerzh_fast) \
237 SymX(complementIntegerzh_fast) \
239 SymX(blockAsyncExceptionszh_fast) \
240 SymX(unblockAsyncExceptionszh_fast) \
242 SymX(isDoubleInfinite) \
243 SymX(isDoubleDenormalized) \
244 SymX(isDoubleNegativeZero) \
245 SymX(__encodeFloat) \
247 SymX(isFloatInfinite) \
248 SymX(isFloatDenormalized) \
249 SymX(isFloatNegativeZero) \
250 SymX(__int_encodeFloat) \
251 SymX(__int_encodeDouble) \
252 SymX(__gmpz_cmp_si) \
253 SymX(__gmpz_cmp_ui) \
256 SymX(__gmpz_get_si) \
257 SymX(__gmpz_get_ui) \
260 SymX(resetNonBlockingFd) \
263 SymX(stable_ptr_table) \
264 SymX(shutdownHaskellAndExit) \
265 Sym(stg_enterStackTop) \
266 Sym(stg_yield_to_interpreter) \
270 Sym(__init_PrelGHC) \
271 SymX(freeHaskellFunctionPtr) \
274 SymX(NoRunnableThreadsHook) \
275 SymX(StackOverflowHook) \
276 SymX(OutOfHeapHook) \
277 SymX(MallocFailHook) \
278 SymX(PatErrorHdrHook) \
281 SymX(PostTraceHook) \
282 SymX(createAdjustor) \
297 SymX(rts_mkStablePtr) \
306 SymX(rts_getWord32) \
309 SymX(rts_getDouble) \
310 SymX(rts_getStablePtr) \
316 SymX(rts_evalLazyIO) \
317 SymX(rts_checkSchedStatus)
319 #ifndef SUPPORT_LONG_LONGS
320 #define RTS_LONG_LONG_SYMS /* nothing */
322 #define RTS_LONG_LONG_SYMS \
335 SymX(stg_remWord64) \
336 SymX(stg_quotWord64) \
338 SymX(stg_quotInt64) \
339 SymX(stg_negateInt64) \
340 SymX(stg_plusInt64) \
341 SymX(stg_minusInt64) \
342 SymX(stg_timesInt64) \
348 SymX(stg_shiftRL64) \
349 SymX(stg_iShiftL64) \
350 SymX(stg_iShiftRL64) \
351 SymX(stg_iShiftRA64) \
352 SymX(stg_intToInt64) \
353 SymX(stg_int64ToInt) \
354 SymX(stg_int64ToWord64) \
355 SymX(stg_wordToWord64) \
356 SymX(stg_word64ToWord) \
357 SymX(stg_word64ToInt64) \
358 SymX(int64ToIntegerzh_fast) \
359 SymX(word64ToIntegerzh_fast)
360 #endif /* SUPPORT_LONG_LONGS */
362 /* entirely bogus claims about types of these symbols */
363 #define Sym(vvv) extern void (vvv);
364 #define SymX(vvv) /**/
367 RTS_POSIX_ONLY_SYMBOLS
368 RTS_MINGW_ONLY_SYMBOLS
372 #ifdef LEADING_UNDERSCORE
373 #define MAYBE_LEADING_UNDERSCORE_STR(s) ("_" s)
375 #define MAYBE_LEADING_UNDERSCORE_STR(s) (s)
378 #define Sym(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
380 #define SymX(vvv) Sym(vvv)
382 static RtsSymbolVal rtsSyms[] = {
385 RTS_POSIX_ONLY_SYMBOLS
386 RTS_MINGW_ONLY_SYMBOLS
387 { 0, 0 } /* sentinel */
390 /* -----------------------------------------------------------------------------
391 * initialize the object linker
393 #if defined(OBJFORMAT_ELF)
394 static void *dl_prog_handle;
402 symhash = allocStrHashTable();
404 /* populate the symbol table with stuff from the RTS */
405 for (sym = rtsSyms; sym->lbl != NULL; sym++) {
406 insertStrHashTable(symhash, sym->lbl, sym->addr);
408 # if defined(OBJFORMAT_ELF)
409 dl_prog_handle = dlopen(NULL, RTLD_LAZY);
413 /* -----------------------------------------------------------------------------
414 * Add a DLL from which symbols may be found. In the ELF case, just
415 * do RTLD_GLOBAL-style add, so no further messing around needs to
416 * happen in order that symbols in the loaded .so are findable --
417 * lookupSymbol() will subsequently see them by dlsym on the program's
418 * dl-handle. Returns NULL if success, otherwise ptr to an err msg.
420 * In the PEi386 case, open the DLLs and put handles to them in a
421 * linked list. When looking for a symbol, try all handles in the
425 #if defined(OBJFORMAT_PEi386)
426 /* A record for storing handles into DLLs. */
430 struct _OpenedDLL* next;
435 /* A list thereof. */
436 static OpenedDLL* opened_dlls = NULL;
442 addDLL ( char* dll_name )
444 # if defined(OBJFORMAT_ELF)
449 buf = stgMallocBytes(strlen(dll_name) + 10, "addDll");
450 sprintf(buf, "lib%s.so", dll_name);
451 hdl = dlopen(buf, RTLD_NOW | RTLD_GLOBAL );
454 /* dlopen failed; return a ptr to the error msg. */
456 if (errmsg == NULL) errmsg = "addDLL: unknown error";
461 ASSERT(0); /*NOTREACHED*/
462 # elif defined(OBJFORMAT_PEi386)
464 /* Add this DLL to the list of DLLs in which to search for symbols.
465 The first time through, also add the executable to the list,
466 since we need to search that too. */
470 /* fprintf(stderr, "addDLL %s\n", dll_name ); */
473 /* Later ... can't figure out why this doesn't work. So retain the
474 RTS_MINGW_ONLY_SYMBOLS hack for the time being. */
475 if (opened_dlls == NULL) {
476 /* First time through ... */
477 instance = GetModuleHandle(NULL);
478 if (instance == NULL)
479 return "addDLL: can't get handle to the executable";
480 o_dll = stgMallocBytes( sizeof(OpenedDLL), "addDLL-init" );
481 o_dll->instance = instance;
482 o_dll->next = opened_dlls;
487 buf = stgMallocBytes(strlen(dll_name) + 10, "addDll");
488 sprintf(buf, "%s.DLL", dll_name);
489 instance = LoadLibrary(buf);
491 if (instance == NULL) {
492 /* LoadLibrary failed; return a ptr to the error msg. */
493 return "addDLL: unknown error";
496 o_dll = stgMallocBytes( sizeof(OpenedDLL), "addDLL" );
497 o_dll->instance = instance;
498 o_dll->next = opened_dlls;
503 barf("addDLL: not implemented on this platform");
507 /* -----------------------------------------------------------------------------
508 * lookup a symbol in the hash table
511 lookupSymbol( char *lbl )
514 ASSERT(symhash != NULL);
515 val = lookupStrHashTable(symhash, lbl);
518 # if defined(OBJFORMAT_ELF)
519 return dlsym(dl_prog_handle, lbl);
520 # elif defined(OBJFORMAT_PEi386)
524 for (o_dll = opened_dlls; o_dll != NULL; o_dll = o_dll->next) {
525 sym = GetProcAddress(o_dll->instance, lbl);
526 if (sym != NULL) return sym;
537 lookupLocalSymbol( ObjectCode* oc, char *lbl )
540 val = lookupStrHashTable(oc->lochash, lbl);
550 /* -----------------------------------------------------------------------------
551 * Load an obj (populate the global symbol table, but don't resolve yet)
553 * Returns: 1 if ok, 0 on error.
556 loadObj( char *path )
563 /* fprintf(stderr, "loadObj %s\n", path ); */
565 /* assert that we haven't already loaded this object */
568 for (o = objects; o; o = o->next)
569 ASSERT(strcmp(o->fileName, path));
573 oc = stgMallocBytes(sizeof(ObjectCode), "loadObj(oc)");
575 # if defined(OBJFORMAT_ELF)
576 oc->formatName = "ELF";
577 # elif defined(OBJFORMAT_PEi386)
578 oc->formatName = "PEi386";
581 barf("loadObj: not implemented on this platform");
585 if (r == -1) { return 0; }
587 /* sigh, strdup() isn't a POSIX function, so do it the long way */
588 oc->fileName = stgMallocBytes( strlen(path)+1, "loadObj" );
589 strcpy(oc->fileName, path);
591 oc->fileSize = st.st_size;
592 oc->image = stgMallocBytes( st.st_size, "loadObj(image)" );
595 oc->lochash = allocStrHashTable();
597 /* chain it onto the list of objects */
601 /* load the image into memory */
602 f = fopen(path, "rb");
604 barf("loadObj: can't read `%s'", path);
606 n = fread ( oc->image, 1, oc->fileSize, f );
607 if (n != oc->fileSize) {
609 barf("loadObj: error whilst reading `%s'", path);
612 /* verify the in-memory image */
613 # if defined(OBJFORMAT_ELF)
614 r = ocVerifyImage_ELF ( oc );
615 # elif defined(OBJFORMAT_PEi386)
616 r = ocVerifyImage_PEi386 ( oc );
618 barf("loadObj: no verify method");
620 if (!r) { return r; }
622 /* build the symbol list for this image */
623 # if defined(OBJFORMAT_ELF)
624 r = ocGetNames_ELF ( oc );
625 # elif defined(OBJFORMAT_PEi386)
626 r = ocGetNames_PEi386 ( oc );
628 barf("loadObj: no getNames method");
630 if (!r) { return r; }
632 /* loaded, but not resolved yet */
633 oc->status = OBJECT_LOADED;
638 /* -----------------------------------------------------------------------------
639 * resolve all the currently unlinked objects in memory
641 * Returns: 1 if ok, 0 on error.
649 for (oc = objects; oc; oc = oc->next) {
650 if (oc->status != OBJECT_RESOLVED) {
651 # if defined(OBJFORMAT_ELF)
652 r = ocResolve_ELF ( oc );
653 # elif defined(OBJFORMAT_PEi386)
654 r = ocResolve_PEi386 ( oc );
656 barf("resolveObjs: not implemented on this platform");
658 if (!r) { return r; }
659 oc->status = OBJECT_RESOLVED;
665 /* -----------------------------------------------------------------------------
666 * delete an object from the pool
669 unloadObj( char *path )
671 ObjectCode *oc, *prev;
673 ASSERT(symhash != NULL);
674 ASSERT(objects != NULL);
677 for (oc = objects; oc; prev = oc, oc = oc->next) {
678 if (!strcmp(oc->fileName,path)) {
680 /* Remove all the mappings for the symbols within this
685 for (i = 0; i < oc->n_symbols; i++) {
686 if (oc->symbols[i] != NULL) {
687 removeStrHashTable(symhash, oc->symbols[i], NULL);
695 prev->next = oc->next;
698 /* We're going to leave this in place, in case there are
699 any pointers from the heap into it: */
700 /* free(oc->image); */
704 /* The local hash table should have been freed at the end
705 of the ocResolve_ call on it. */
706 ASSERT(oc->lochash == NULL);
712 belch("unloadObj: can't find `%s' to unload", path);
716 /* --------------------------------------------------------------------------
717 * PEi386 specifics (Win32 targets)
718 * ------------------------------------------------------------------------*/
720 /* The information for this linker comes from
721 Microsoft Portable Executable
722 and Common Object File Format Specification
723 revision 5.1 January 1998
724 which SimonM says comes from the MS Developer Network CDs.
728 #if defined(OBJFORMAT_PEi386)
732 typedef unsigned char UChar;
733 typedef unsigned short UInt16;
734 typedef unsigned int UInt32;
741 UInt16 NumberOfSections;
742 UInt32 TimeDateStamp;
743 UInt32 PointerToSymbolTable;
744 UInt32 NumberOfSymbols;
745 UInt16 SizeOfOptionalHeader;
746 UInt16 Characteristics;
750 #define sizeof_COFF_header 20
757 UInt32 VirtualAddress;
758 UInt32 SizeOfRawData;
759 UInt32 PointerToRawData;
760 UInt32 PointerToRelocations;
761 UInt32 PointerToLinenumbers;
762 UInt16 NumberOfRelocations;
763 UInt16 NumberOfLineNumbers;
764 UInt32 Characteristics;
768 #define sizeof_COFF_section 40
775 UInt16 SectionNumber;
778 UChar NumberOfAuxSymbols;
782 #define sizeof_COFF_symbol 18
787 UInt32 VirtualAddress;
788 UInt32 SymbolTableIndex;
793 #define sizeof_COFF_reloc 10
796 /* From PE spec doc, section 3.3.2 */
797 /* Note use of MYIMAGE_* since IMAGE_* are already defined in
798 windows.h -- for the same purpose, but I want to know what I'm
800 #define MYIMAGE_FILE_RELOCS_STRIPPED 0x0001
801 #define MYIMAGE_FILE_EXECUTABLE_IMAGE 0x0002
802 #define MYIMAGE_FILE_DLL 0x2000
803 #define MYIMAGE_FILE_SYSTEM 0x1000
804 #define MYIMAGE_FILE_BYTES_REVERSED_HI 0x8000
805 #define MYIMAGE_FILE_BYTES_REVERSED_LO 0x0080
806 #define MYIMAGE_FILE_32BIT_MACHINE 0x0100
808 /* From PE spec doc, section 5.4.2 and 5.4.4 */
809 #define MYIMAGE_SYM_CLASS_EXTERNAL 2
810 #define MYIMAGE_SYM_CLASS_STATIC 3
811 #define MYIMAGE_SYM_UNDEFINED 0
813 /* From PE spec doc, section 4.1 */
814 #define MYIMAGE_SCN_CNT_CODE 0x00000020
815 #define MYIMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
817 /* From PE spec doc, section 5.2.1 */
818 #define MYIMAGE_REL_I386_DIR32 0x0006
819 #define MYIMAGE_REL_I386_REL32 0x0014
822 /* We use myindex to calculate array addresses, rather than
823 simply doing the normal subscript thing. That's because
824 some of the above structs have sizes which are not
825 a whole number of words. GCC rounds their sizes up to a
826 whole number of words, which means that the address calcs
827 arising from using normal C indexing or pointer arithmetic
828 are just plain wrong. Sigh.
831 myindex ( int scale, void* base, int index )
834 ((UChar*)base) + scale * index;
839 printName ( UChar* name, UChar* strtab )
841 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
842 UInt32 strtab_offset = * (UInt32*)(name+4);
843 fprintf ( stderr, "%s", strtab + strtab_offset );
846 for (i = 0; i < 8; i++) {
847 if (name[i] == 0) break;
848 fprintf ( stderr, "%c", name[i] );
855 copyName ( UChar* name, UChar* strtab, UChar* dst, int dstSize )
857 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
858 UInt32 strtab_offset = * (UInt32*)(name+4);
859 strncpy ( dst, strtab+strtab_offset, dstSize );
865 if (name[i] == 0) break;
875 cstring_from_COFF_symbol_name ( UChar* name, UChar* strtab )
878 /* If the string is longer than 8 bytes, look in the
879 string table for it -- this will be correctly zero terminated.
881 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
882 UInt32 strtab_offset = * (UInt32*)(name+4);
883 return ((UChar*)strtab) + strtab_offset;
885 /* Otherwise, if shorter than 8 bytes, return the original,
886 which by defn is correctly terminated.
888 if (name[7]==0) return name;
889 /* The annoying case: 8 bytes. Copy into a temporary
890 (which is never freed ...)
892 newstr = stgMallocBytes(9, "cstring_from_COFF_symbol_name");
894 strncpy(newstr,name,8);
900 /* Just compares the short names (first 8 chars) */
901 static COFF_section *
902 findPEi386SectionCalled ( ObjectCode* oc, char* name )
906 = (COFF_header*)(oc->image);
909 ((UChar*)(oc->image))
910 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
912 for (i = 0; i < hdr->NumberOfSections; i++) {
915 COFF_section* section_i
917 myindex ( sizeof_COFF_section, sectab, i );
918 n1 = (UChar*) &(section_i->Name);
920 if (n1[0]==n2[0] && n1[1]==n2[1] && n1[2]==n2[2] &&
921 n1[3]==n2[3] && n1[4]==n2[4] && n1[5]==n2[5] &&
922 n1[6]==n2[6] && n1[7]==n2[7])
931 zapTrailingAtSign ( UChar* sym )
933 # define my_isdigit(c) ((c) >= '0' && (c) <= '9')
935 if (sym[0] == 0) return;
937 while (sym[i] != 0) i++;
940 while (j > 0 && my_isdigit(sym[j])) j--;
941 if (j > 0 && sym[j] == '@' && j != i) sym[j] = 0;
947 ocVerifyImage_PEi386 ( ObjectCode* oc )
951 COFF_section* sectab;
955 hdr = (COFF_header*)(oc->image);
956 sectab = (COFF_section*) (
957 ((UChar*)(oc->image))
958 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
960 symtab = (COFF_symbol*) (
961 ((UChar*)(oc->image))
962 + hdr->PointerToSymbolTable
964 strtab = ((UChar*)symtab)
965 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
967 if (hdr->Machine != 0x14c) {
968 belch("Not x86 PEi386");
971 if (hdr->SizeOfOptionalHeader != 0) {
972 belch("PEi386 with nonempty optional header");
975 if ( /* (hdr->Characteristics & MYIMAGE_FILE_RELOCS_STRIPPED) || */
976 (hdr->Characteristics & MYIMAGE_FILE_EXECUTABLE_IMAGE) ||
977 (hdr->Characteristics & MYIMAGE_FILE_DLL) ||
978 (hdr->Characteristics & MYIMAGE_FILE_SYSTEM) ) {
979 belch("Not a PEi386 object file");
982 if ( (hdr->Characteristics & MYIMAGE_FILE_BYTES_REVERSED_HI)
983 /* || !(hdr->Characteristics & MYIMAGE_FILE_32BIT_MACHINE) */ ) {
984 belch("Invalid PEi386 word size or endiannness: %d",
985 (int)(hdr->Characteristics));
988 /* fprintf(stderr, "strtab size %d\n", * (UInt32*)strtab); */
989 if (* (UInt32*)strtab > 510000) {
990 belch("PEi386 object has suspiciously large string table; > 64k relocs?");
994 /* No further verification after this point; only debug printing. */
996 IF_DEBUG(linker, i=1);
997 if (i == 0) return 1;
1000 "sectab offset = %d\n", ((UChar*)sectab) - ((UChar*)hdr) );
1002 "symtab offset = %d\n", ((UChar*)symtab) - ((UChar*)hdr) );
1004 "strtab offset = %d\n", ((UChar*)strtab) - ((UChar*)hdr) );
1006 fprintf ( stderr, "\n" );
1008 "Machine: 0x%x\n", (UInt32)(hdr->Machine) );
1010 "# sections: %d\n", (UInt32)(hdr->NumberOfSections) );
1012 "time/date: 0x%x\n", (UInt32)(hdr->TimeDateStamp) );
1014 "symtab offset: %d\n", (UInt32)(hdr->PointerToSymbolTable) );
1016 "# symbols: %d\n", (UInt32)(hdr->NumberOfSymbols) );
1018 "sz of opt hdr: %d\n", (UInt32)(hdr->SizeOfOptionalHeader) );
1020 "characteristics: 0x%x\n", (UInt32)(hdr->Characteristics) );
1022 /* Print the section table. */
1023 fprintf ( stderr, "\n" );
1024 for (i = 0; i < hdr->NumberOfSections; i++) {
1026 COFF_section* sectab_i
1028 myindex ( sizeof_COFF_section, sectab, i );
1035 printName ( sectab_i->Name, strtab );
1044 sectab_i->VirtualSize,
1045 sectab_i->VirtualAddress,
1046 sectab_i->SizeOfRawData,
1047 sectab_i->PointerToRawData,
1048 sectab_i->NumberOfRelocations,
1049 sectab_i->PointerToRelocations
1051 reltab = (COFF_reloc*) (
1052 ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
1055 for (j = 0; j < sectab_i->NumberOfRelocations; j++) {
1057 COFF_reloc* rel = (COFF_reloc*)
1058 myindex ( sizeof_COFF_reloc, reltab, j );
1060 " type 0x%-4x vaddr 0x%-8x name `",
1062 rel->VirtualAddress );
1063 sym = (COFF_symbol*)
1064 myindex ( sizeof_COFF_symbol, symtab, rel->SymbolTableIndex );
1065 printName ( sym->Name, strtab -10 );
1066 fprintf ( stderr, "'\n" );
1068 fprintf ( stderr, "\n" );
1071 fprintf ( stderr, "\n" );
1072 fprintf ( stderr, "string table has size 0x%x\n", * (UInt32*)strtab );
1073 fprintf ( stderr, "---START of string table---\n");
1074 for (i = 4; i < *(Int32*)strtab; i++) {
1076 fprintf ( stderr, "\n"); else
1077 fprintf( stderr, "%c", strtab[i] );
1079 fprintf ( stderr, "--- END of string table---\n");
1081 fprintf ( stderr, "\n" );
1084 COFF_symbol* symtab_i;
1085 if (i >= (Int32)(hdr->NumberOfSymbols)) break;
1086 symtab_i = (COFF_symbol*)
1087 myindex ( sizeof_COFF_symbol, symtab, i );
1093 printName ( symtab_i->Name, strtab );
1102 (Int32)(symtab_i->SectionNumber) - 1,
1103 (UInt32)symtab_i->Type,
1104 (UInt32)symtab_i->StorageClass,
1105 (UInt32)symtab_i->NumberOfAuxSymbols
1107 i += symtab_i->NumberOfAuxSymbols;
1111 fprintf ( stderr, "\n" );
1117 ocGetNames_PEi386 ( ObjectCode* oc )
1120 COFF_section* sectab;
1121 COFF_symbol* symtab;
1128 hdr = (COFF_header*)(oc->image);
1129 sectab = (COFF_section*) (
1130 ((UChar*)(oc->image))
1131 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1133 symtab = (COFF_symbol*) (
1134 ((UChar*)(oc->image))
1135 + hdr->PointerToSymbolTable
1137 strtab = ((UChar*)(oc->image))
1138 + hdr->PointerToSymbolTable
1139 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
1141 /* Copy exported symbols into the ObjectCode. */
1143 oc->n_symbols = hdr->NumberOfSymbols;
1144 oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
1145 "ocGetNames_PEi386(oc->symbols)");
1146 /* Call me paranoid; I don't care. */
1147 for (i = 0; i < oc->n_symbols; i++)
1148 oc->symbols[i] = NULL;
1152 COFF_symbol* symtab_i;
1153 if (i >= (Int32)(hdr->NumberOfSymbols)) break;
1154 symtab_i = (COFF_symbol*)
1155 myindex ( sizeof_COFF_symbol, symtab, i );
1157 if (symtab_i->StorageClass == MYIMAGE_SYM_CLASS_EXTERNAL &&
1158 symtab_i->SectionNumber != MYIMAGE_SYM_UNDEFINED) {
1160 /* This symbol is global and defined, viz, exported */
1161 COFF_section* sectabent;
1163 /* cstring_from_COFF_symbol_name always succeeds. */
1164 sname = cstring_from_COFF_symbol_name ( symtab_i->Name, strtab );
1166 /* for MYIMAGE_SYMCLASS_EXTERNAL
1167 && !MYIMAGE_SYM_UNDEFINED,
1168 the address of the symbol is:
1169 address of relevant section + offset in section
1171 sectabent = (COFF_section*)
1172 myindex ( sizeof_COFF_section,
1174 symtab_i->SectionNumber-1 );
1175 addr = ((UChar*)(oc->image))
1176 + (sectabent->PointerToRawData
1178 IF_DEBUG(linker, belch("addSymbol %p `%s'\n", addr,sname);)
1179 ASSERT(i >= 0 && i < oc->n_symbols);
1180 oc->symbols[i] = sname;
1181 insertStrHashTable(symhash, sname, addr);
1183 i += symtab_i->NumberOfAuxSymbols;
1187 /* Copy section information into the ObjectCode. */
1189 oc->n_sections = hdr->NumberOfSections;
1190 oc->sections = stgMallocBytes( oc->n_sections * sizeof(Section),
1191 "ocGetNamesPEi386" );
1193 for (i = 0; i < oc->n_sections; i++) {
1198 = SECTIONKIND_OTHER;
1199 COFF_section* sectab_i
1201 myindex ( sizeof_COFF_section, sectab, i );
1202 IF_DEBUG(linker, belchf("section name = %s\n", sectab_i->Name ));
1205 /* I'm sure this is the Right Way to do it. However, the
1206 alternative of testing the sectab_i->Name field seems to
1207 work ok with Cygwin.
1209 if (sectab_i->Characteristics & MYIMAGE_SCN_CNT_CODE ||
1210 sectab_i->Characteristics & MYIMAGE_SCN_CNT_INITIALIZED_DATA)
1211 kind = SECTIONKIND_CODE_OR_RODATA;
1214 if (0==strcmp(".text",sectab_i->Name))
1215 kind = SECTIONKIND_CODE_OR_RODATA;
1216 if (0==strcmp(".data",sectab_i->Name) ||
1217 0==strcmp(".bss",sectab_i->Name))
1218 kind = SECTIONKIND_RWDATA;
1220 start = ((UChar*)(oc->image))
1221 + sectab_i->PointerToRawData;
1223 + sectab_i->SizeOfRawData - 1;
1225 if (kind == SECTIONKIND_OTHER) {
1226 belch("Unknown PEi386 section name `%s'", sectab_i->Name);
1230 oc->sections[i].start = start;
1231 oc->sections[i].end = end;
1232 oc->sections[i].kind = kind;
1240 ocResolve_PEi386 ( ObjectCode* oc )
1243 COFF_section* sectab;
1244 COFF_symbol* symtab;
1253 /* ToDo: should be variable-sized? But is at least safe in the
1254 sense of buffer-overrun-proof. */
1256 /* fprintf(stderr, "resolving for %s\n", oc->fileName); */
1258 hdr = (COFF_header*)(oc->image);
1259 sectab = (COFF_section*) (
1260 ((UChar*)(oc->image))
1261 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1263 symtab = (COFF_symbol*) (
1264 ((UChar*)(oc->image))
1265 + hdr->PointerToSymbolTable
1267 strtab = ((UChar*)(oc->image))
1268 + hdr->PointerToSymbolTable
1269 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
1271 for (i = 0; i < hdr->NumberOfSections; i++) {
1272 COFF_section* sectab_i
1274 myindex ( sizeof_COFF_section, sectab, i );
1277 ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
1279 for (j = 0; j < sectab_i->NumberOfRelocations; j++) {
1281 COFF_reloc* reltab_j
1283 myindex ( sizeof_COFF_reloc, reltab, j );
1285 /* the location to patch */
1287 ((UChar*)(oc->image))
1288 + (sectab_i->PointerToRawData
1289 + reltab_j->VirtualAddress
1290 - sectab_i->VirtualAddress )
1292 /* the existing contents of pP */
1294 /* the symbol to connect to */
1295 sym = (COFF_symbol*)
1296 myindex ( sizeof_COFF_symbol,
1297 symtab, reltab_j->SymbolTableIndex );
1300 "reloc sec %2d num %3d: type 0x%-4x "
1301 "vaddr 0x%-8x name `",
1303 (UInt32)reltab_j->Type,
1304 reltab_j->VirtualAddress );
1305 printName ( sym->Name, strtab );
1306 fprintf ( stderr, "'\n" ));
1308 if (sym->StorageClass == MYIMAGE_SYM_CLASS_STATIC) {
1309 COFF_section* section_sym
1310 = findPEi386SectionCalled ( oc, sym->Name );
1312 fprintf ( stderr, "bad section = `%s'\n", sym->Name );
1313 barf("Can't find abovementioned PEi386 section");
1316 S = ((UInt32)(oc->image))
1317 + (section_sym->PointerToRawData
1320 copyName ( sym->Name, strtab, symbol, 1000-1 );
1321 zapTrailingAtSign ( symbol );
1322 (void*)S = lookupLocalSymbol( oc, symbol );
1323 if ((void*)S == NULL)
1324 (void*)S = lookupSymbol( symbol );
1326 belch("ocResolve_PEi386: %s: unknown symbol `%s'",
1327 oc->fileName, symbol);
1332 switch (reltab_j->Type) {
1333 case MYIMAGE_REL_I386_DIR32:
1336 case MYIMAGE_REL_I386_REL32:
1337 /* Tricky. We have to insert a displacement at
1338 pP which, when added to the PC for the _next_
1339 insn, gives the address of the target (S).
1340 Problem is to know the address of the next insn
1341 when we only know pP. We assume that this
1342 literal field is always the last in the insn,
1343 so that the address of the next insn is pP+4
1344 -- hence the constant 4.
1345 Also I don't know if A should be added, but so
1346 far it has always been zero.
1349 *pP = S - ((UInt32)pP) - 4;
1353 "unhandled PEi386 relocation type %d\n",
1355 barf("unhandled PEi386 relocation type");
1362 /* fprintf(stderr, "completed %s\n", oc->fileName); */
1366 #endif /* defined(OBJFORMAT_PEi386) */
1369 /* --------------------------------------------------------------------------
1371 * ------------------------------------------------------------------------*/
1373 #if defined(OBJFORMAT_ELF)
1378 #if defined(sparc_TARGET_ARCH)
1379 # define ELF_TARGET_SPARC /* Used inside <elf.h> */
1385 findElfSection ( void* objImage, Elf32_Word sh_type )
1388 char* ehdrC = (char*)objImage;
1389 Elf32_Ehdr* ehdr = ( Elf32_Ehdr*)ehdrC;
1390 Elf32_Shdr* shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
1392 for (i = 0; i < ehdr->e_shnum; i++) {
1393 if (shdr[i].sh_type == sh_type &&
1394 i != ehdr->e_shstrndx) {
1395 ptr = ehdrC + shdr[i].sh_offset;
1404 ocVerifyImage_ELF ( ObjectCode* oc )
1408 int i, j, nent, nstrtab, nsymtabs;
1412 char* ehdrC = (char*)(oc->image);
1413 Elf32_Ehdr* ehdr = ( Elf32_Ehdr*)ehdrC;
1415 if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
1416 ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
1417 ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
1418 ehdr->e_ident[EI_MAG3] != ELFMAG3) {
1419 belch("ocVerifyImage_ELF: not an ELF header");
1422 IF_DEBUG(linker,belch( "Is an ELF header" ));
1424 if (ehdr->e_ident[EI_CLASS] != ELFCLASS32) {
1425 belch("ocVerifyImage_ELF: not 32 bit ELF" );
1429 IF_DEBUG(linker,belch( "Is 32 bit ELF" ));
1431 if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
1432 IF_DEBUG(linker,belch( "Is little-endian" ));
1434 if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
1435 IF_DEBUG(linker,belch( "Is big-endian" ));
1437 belch("ocVerifyImage_ELF: unknown endiannness");
1441 if (ehdr->e_type != ET_REL) {
1442 belch("ocVerifyImage_ELF: not a relocatable object (.o) file");
1445 IF_DEBUG(linker, belch( "Is a relocatable object (.o) file" ));
1447 IF_DEBUG(linker,belch( "Architecture is " ));
1448 switch (ehdr->e_machine) {
1449 case EM_386: IF_DEBUG(linker,belch( "x86" )); break;
1450 case EM_SPARC: IF_DEBUG(linker,belch( "sparc" )); break;
1451 default: IF_DEBUG(linker,belch( "unknown" ));
1452 belch("ocVerifyImage_ELF: unknown architecture");
1456 IF_DEBUG(linker,belch(
1457 "\nSection header table: start %d, n_entries %d, ent_size %d",
1458 ehdr->e_shoff, ehdr->e_shnum, ehdr->e_shentsize ));
1460 ASSERT (ehdr->e_shentsize == sizeof(Elf32_Shdr));
1462 shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
1464 if (ehdr->e_shstrndx == SHN_UNDEF) {
1465 belch("ocVerifyImage_ELF: no section header string table");
1468 IF_DEBUG(linker,belch( "Section header string table is section %d",
1470 sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
1473 for (i = 0; i < ehdr->e_shnum; i++) {
1474 IF_DEBUG(linker,fprintf(stderr, "%2d: ", i ));
1475 IF_DEBUG(linker,fprintf(stderr, "type=%2d ", (int)shdr[i].sh_type ));
1476 IF_DEBUG(linker,fprintf(stderr, "size=%4d ", (int)shdr[i].sh_size ));
1477 IF_DEBUG(linker,fprintf(stderr, "offs=%4d ", (int)shdr[i].sh_offset ));
1478 IF_DEBUG(linker,fprintf(stderr, " (%p .. %p) ",
1479 ehdrC + shdr[i].sh_offset,
1480 ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1));
1482 if (shdr[i].sh_type == SHT_REL) {
1483 IF_DEBUG(linker,fprintf(stderr, "Rel " ));
1484 } else if (shdr[i].sh_type == SHT_RELA) {
1485 IF_DEBUG(linker,fprintf(stderr, "RelA " ));
1487 IF_DEBUG(linker,fprintf(stderr," "));
1490 IF_DEBUG(linker,fprintf(stderr, "sname=%s\n", sh_strtab + shdr[i].sh_name ));
1494 IF_DEBUG(linker,belch( "\nString tables" ));
1497 for (i = 0; i < ehdr->e_shnum; i++) {
1498 if (shdr[i].sh_type == SHT_STRTAB &&
1499 i != ehdr->e_shstrndx) {
1500 IF_DEBUG(linker,belch(" section %d is a normal string table", i ));
1501 strtab = ehdrC + shdr[i].sh_offset;
1506 belch("ocVerifyImage_ELF: no string tables, or too many");
1511 IF_DEBUG(linker,belch( "\nSymbol tables" ));
1512 for (i = 0; i < ehdr->e_shnum; i++) {
1513 if (shdr[i].sh_type != SHT_SYMTAB) continue;
1514 IF_DEBUG(linker,belch( "section %d is a symbol table", i ));
1516 stab = (Elf32_Sym*) (ehdrC + shdr[i].sh_offset);
1517 nent = shdr[i].sh_size / sizeof(Elf32_Sym);
1518 IF_DEBUG(linker,belch( " number of entries is apparently %d (%d rem)",
1520 shdr[i].sh_size % sizeof(Elf32_Sym)
1522 if (0 != shdr[i].sh_size % sizeof(Elf32_Sym)) {
1523 belch("ocVerifyImage_ELF: non-integral number of symbol table entries");
1526 for (j = 0; j < nent; j++) {
1527 IF_DEBUG(linker,fprintf(stderr, " %2d ", j ));
1528 IF_DEBUG(linker,fprintf(stderr, " sec=%-5d size=%-3d val=%5p ",
1529 (int)stab[j].st_shndx,
1530 (int)stab[j].st_size,
1531 (char*)stab[j].st_value ));
1533 IF_DEBUG(linker,fprintf(stderr, "type=" ));
1534 switch (ELF32_ST_TYPE(stab[j].st_info)) {
1535 case STT_NOTYPE: IF_DEBUG(linker,fprintf(stderr, "notype " )); break;
1536 case STT_OBJECT: IF_DEBUG(linker,fprintf(stderr, "object " )); break;
1537 case STT_FUNC : IF_DEBUG(linker,fprintf(stderr, "func " )); break;
1538 case STT_SECTION: IF_DEBUG(linker,fprintf(stderr, "section" )); break;
1539 case STT_FILE: IF_DEBUG(linker,fprintf(stderr, "file " )); break;
1540 default: IF_DEBUG(linker,fprintf(stderr, "? " )); break;
1542 IF_DEBUG(linker,fprintf(stderr, " " ));
1544 IF_DEBUG(linker,fprintf(stderr, "bind=" ));
1545 switch (ELF32_ST_BIND(stab[j].st_info)) {
1546 case STB_LOCAL : IF_DEBUG(linker,fprintf(stderr, "local " )); break;
1547 case STB_GLOBAL: IF_DEBUG(linker,fprintf(stderr, "global" )); break;
1548 case STB_WEAK : IF_DEBUG(linker,fprintf(stderr, "weak " )); break;
1549 default: IF_DEBUG(linker,fprintf(stderr, "? " )); break;
1551 IF_DEBUG(linker,fprintf(stderr, " " ));
1553 IF_DEBUG(linker,fprintf(stderr, "name=%s\n", strtab + stab[j].st_name ));
1557 if (nsymtabs == 0) {
1558 belch("ocVerifyImage_ELF: didn't find any symbol tables");
1567 ocGetNames_ELF ( ObjectCode* oc )
1572 char* ehdrC = (char*)(oc->image);
1573 Elf32_Ehdr* ehdr = (Elf32_Ehdr*)ehdrC;
1574 char* strtab = findElfSection ( ehdrC, SHT_STRTAB );
1575 Elf32_Shdr* shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
1576 char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
1578 ASSERT(symhash != NULL);
1581 belch("ocGetNames_ELF: no strtab");
1586 oc->n_sections = ehdr->e_shnum;
1587 oc->sections = stgMallocBytes( oc->n_sections * sizeof(Section),
1588 "ocGetNames_ELF(oc->sections)" );
1590 for (i = 0; i < oc->n_sections; i++) {
1592 /* make a section entry for relevant sections */
1593 SectionKind kind = SECTIONKIND_OTHER;
1594 if (!strcmp(".data",sh_strtab+shdr[i].sh_name) ||
1595 !strcmp(".data1",sh_strtab+shdr[i].sh_name))
1596 kind = SECTIONKIND_RWDATA;
1597 if (!strcmp(".text",sh_strtab+shdr[i].sh_name) ||
1598 !strcmp(".rodata",sh_strtab+shdr[i].sh_name) ||
1599 !strcmp(".rodata1",sh_strtab+shdr[i].sh_name))
1600 kind = SECTIONKIND_CODE_OR_RODATA;
1602 /* fill in the section info */
1603 oc->sections[i].start = ehdrC + shdr[i].sh_offset;
1604 oc->sections[i].end = ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1;
1605 oc->sections[i].kind = kind;
1607 if (shdr[i].sh_type != SHT_SYMTAB) continue;
1609 /* copy stuff into this module's object symbol table */
1610 stab = (Elf32_Sym*) (ehdrC + shdr[i].sh_offset);
1611 nent = shdr[i].sh_size / sizeof(Elf32_Sym);
1613 oc->n_symbols = nent;
1614 oc->symbols = stgMallocBytes(oc->n_symbols * sizeof(char*),
1615 "ocGetNames_ELF(oc->symbols)");
1617 for (j = 0; j < nent; j++) {
1618 if ( ( ELF32_ST_BIND(stab[j].st_info)==STB_GLOBAL
1619 || ELF32_ST_BIND(stab[j].st_info)==STB_LOCAL
1621 /* and not an undefined symbol */
1622 && stab[j].st_shndx != SHN_UNDEF
1623 /* and not in a "special section" */
1624 && stab[j].st_shndx < SHN_LORESERVE
1626 /* and it's a not a section or string table or anything silly */
1627 ( ELF32_ST_TYPE(stab[j].st_info)==STT_FUNC ||
1628 ELF32_ST_TYPE(stab[j].st_info)==STT_OBJECT ||
1629 ELF32_ST_TYPE(stab[j].st_info)==STT_NOTYPE
1632 char* nm = strtab + stab[j].st_name;
1634 + shdr[ stab[j].st_shndx ].sh_offset
1638 oc->symbols[j] = nm;
1639 if (ELF32_ST_BIND(stab[j].st_info)==STB_LOCAL) {
1640 IF_DEBUG(linker,belch( "addOTabName(LOCL): %10p %s %s",
1641 ad, oc->fileName, nm ));
1642 insertStrHashTable(oc->lochash, nm, ad);
1644 IF_DEBUG(linker,belch( "addOTabName(GLOB): %10p %s %s",
1645 ad, oc->fileName, nm ));
1646 insertStrHashTable(symhash, nm, ad);
1650 IF_DEBUG(linker,belch( "skipping `%s'",
1651 strtab + stab[j].st_name ));
1654 "skipping bind = %d, type = %d, shndx = %d `%s'\n",
1655 (int)ELF32_ST_BIND(stab[j].st_info),
1656 (int)ELF32_ST_TYPE(stab[j].st_info),
1657 (int)stab[j].st_shndx,
1658 strtab + stab[j].st_name
1661 oc->symbols[j] = NULL;
1670 /* Do ELF relocations which lack an explicit addend. All x86-linux
1671 relocations appear to be of this form. */
1672 static int do_Elf32_Rel_relocations ( ObjectCode* oc, char* ehdrC,
1673 Elf32_Shdr* shdr, int shnum,
1674 Elf32_Sym* stab, char* strtab )
1679 Elf32_Rel* rtab = (Elf32_Rel*) (ehdrC + shdr[shnum].sh_offset);
1680 int nent = shdr[shnum].sh_size / sizeof(Elf32_Rel);
1681 int target_shndx = shdr[shnum].sh_info;
1682 int symtab_shndx = shdr[shnum].sh_link;
1683 stab = (Elf32_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
1684 targ = (Elf32_Word*)(ehdrC + shdr[ target_shndx ].sh_offset);
1685 IF_DEBUG(linker,belch( "relocations for section %d using symtab %d",
1686 target_shndx, symtab_shndx ));
1687 for (j = 0; j < nent; j++) {
1688 Elf32_Addr offset = rtab[j].r_offset;
1689 Elf32_Word info = rtab[j].r_info;
1691 Elf32_Addr P = ((Elf32_Addr)targ) + offset;
1692 Elf32_Word* pP = (Elf32_Word*)P;
1696 IF_DEBUG(linker,belch( "Rel entry %3d is raw(%6p %6p)",
1697 j, (void*)offset, (void*)info ));
1699 IF_DEBUG(linker,belch( " ZERO" ));
1702 /* First see if it is a nameless local symbol. */
1703 if (stab[ ELF32_R_SYM(info)].st_name == 0) {
1704 symbol = "(noname)";
1706 (ehdrC + shdr[stab[ELF32_R_SYM(info)].st_shndx ].sh_offset
1707 + stab[ELF32_R_SYM(info)].st_value);
1709 /* No? Should be in a symbol table then; first try the
1711 symbol = strtab+stab[ ELF32_R_SYM(info)].st_name;
1712 (void*)S = lookupLocalSymbol( oc, symbol );
1713 if ((void*)S == NULL)
1714 (void*)S = lookupSymbol( symbol );
1717 barf("do_Elf32_Rel_relocations: %s: unknown symbol `%s'",
1718 oc->fileName, symbol);
1720 IF_DEBUG(linker,belch( "`%s' resolves to %p", symbol, (void*)S ));
1722 IF_DEBUG(linker,belch( "Reloc: P = %p S = %p A = %p",
1723 (void*)P, (void*)S, (void*)A ));
1724 switch (ELF32_R_TYPE(info)) {
1725 # ifdef i386_TARGET_ARCH
1726 case R_386_32: *pP = S + A; break;
1727 case R_386_PC32: *pP = S + A - P; break;
1730 fprintf(stderr, "unhandled ELF relocation(Rel) type %d\n",
1731 ELF32_R_TYPE(info));
1732 barf("do_Elf32_Rel_relocations: unhandled ELF relocation type");
1741 /* Do ELF relocations for which explicit addends are supplied.
1742 sparc-solaris relocations appear to be of this form. */
1743 static int do_Elf32_Rela_relocations ( ObjectCode* oc, char* ehdrC,
1744 Elf32_Shdr* shdr, int shnum,
1745 Elf32_Sym* stab, char* strtab )
1750 Elf32_Rela* rtab = (Elf32_Rela*) (ehdrC + shdr[shnum].sh_offset);
1751 int nent = shdr[shnum].sh_size / sizeof(Elf32_Rela);
1752 int target_shndx = shdr[shnum].sh_info;
1753 int symtab_shndx = shdr[shnum].sh_link;
1754 stab = (Elf32_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
1755 targ = (Elf32_Word*)(ehdrC + shdr[ target_shndx ].sh_offset);
1756 IF_DEBUG(linker,belch( "relocations for section %d using symtab %d",
1757 target_shndx, symtab_shndx ));
1758 for (j = 0; j < nent; j++) {
1759 Elf32_Addr offset = rtab[j].r_offset;
1760 Elf32_Word info = rtab[j].r_info;
1761 Elf32_Sword addend = rtab[j].r_addend;
1763 Elf32_Addr P = ((Elf32_Addr)targ) + offset;
1764 Elf32_Addr A = addend;
1766 # if defined(sparc_TARGET_ARCH)
1767 /* This #ifdef only serves to avoid unused-var warnings. */
1768 Elf32_Word* pP = (Elf32_Word*)P;
1772 IF_DEBUG(linker,belch( "Rel entry %3d is raw(%6p %6p %6p) ",
1773 j, (void*)offset, (void*)info,
1776 IF_DEBUG(linker,belch( " ZERO" ));
1779 /* First see if it is a nameless local symbol. */
1780 if (stab[ ELF32_R_SYM(info)].st_name == 0) {
1781 symbol = "(noname)";
1783 (ehdrC + shdr[stab[ELF32_R_SYM(info)].st_shndx ].sh_offset
1784 + stab[ELF32_R_SYM(info)].st_value);
1786 /* No? Should be in a symbol table then; first try the
1788 symbol = strtab+stab[ ELF32_R_SYM(info)].st_name;
1789 (void*)S = lookupLocalSymbol( oc, symbol );
1790 if ((void*)S == NULL)
1791 (void*)S = lookupSymbol( symbol );
1794 barf("do_Elf32_Rela_relocations: %s: unknown symbol `%s'",
1795 oc->fileName, symbol);
1798 fprintf ( stderr, "S %p A %p S+A %p S+A-P %p\n",S,A,S+A,S+A-P);
1801 IF_DEBUG(linker,belch( "`%s' resolves to %p", symbol, (void*)S ));
1803 IF_DEBUG(linker,fprintf ( stderr, "Reloc: P = %p S = %p A = %p\n",
1804 (void*)P, (void*)S, (void*)A ));
1805 switch (ELF32_R_TYPE(info)) {
1806 # if defined(sparc_TARGET_ARCH)
1807 case R_SPARC_WDISP30:
1808 w1 = *pP & 0xC0000000;
1809 w2 = (Elf32_Word)((S + A - P) >> 2);
1810 ASSERT((w2 & 0xC0000000) == 0);
1815 w1 = *pP & 0xFFC00000;
1816 w2 = (Elf32_Word)((S + A) >> 10);
1817 ASSERT((w2 & 0xFFC00000) == 0);
1823 w2 = (Elf32_Word)((S + A) & 0x3FF);
1824 ASSERT((w2 & ~0x3FF) == 0);
1829 w2 = (Elf32_Word)(S + A);
1834 fprintf(stderr, "unhandled ELF relocation(RelA) type %d\n",
1835 ELF32_R_TYPE(info));
1836 barf("do_Elf32_Rela_relocations: unhandled ELF relocation type");
1846 ocResolve_ELF ( ObjectCode* oc )
1850 Elf32_Sym* stab = NULL;
1851 char* ehdrC = (char*)(oc->image);
1852 Elf32_Ehdr* ehdr = (Elf32_Ehdr*) ehdrC;
1853 Elf32_Shdr* shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
1855 /* first find "the" symbol table */
1856 stab = (Elf32_Sym*) findElfSection ( ehdrC, SHT_SYMTAB );
1858 /* also go find the string table */
1859 strtab = findElfSection ( ehdrC, SHT_STRTAB );
1861 if (stab == NULL || strtab == NULL) {
1862 belch("ocResolve_ELF: can't find string or symbol table");
1866 /* Process the relocation sections. */
1867 for (shnum = 0; shnum < ehdr->e_shnum; shnum++) {
1868 if (shdr[shnum].sh_type == SHT_REL ) {
1869 ok = do_Elf32_Rel_relocations ( oc, ehdrC, shdr,
1870 shnum, stab, strtab );
1874 if (shdr[shnum].sh_type == SHT_RELA) {
1875 ok = do_Elf32_Rela_relocations ( oc, ehdrC, shdr,
1876 shnum, stab, strtab );
1881 /* Free the local symbol table; we won't need it again. */
1882 freeHashTable(oc->lochash, NULL);