1 /* -----------------------------------------------------------------------------
2 * $Id: Linker.c,v 1.16 2001/02/01 12:37:44 simonmar Exp $
4 * (c) The GHC Team, 2000
8 * ---------------------------------------------------------------------------*/
16 #include "StoragePriv.h"
18 #ifdef HAVE_SYS_TYPES_H
19 #include <sys/types.h>
22 #ifdef HAVE_SYS_STAT_H
30 #ifdef GHCI /* endif is right at end of file */
32 #if defined(linux_TARGET_OS) || defined(solaris2_TARGET_OS) || defined(freebsd_TARGET_OS)
34 #elif defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS)
35 #define OBJFORMAT_PEi386
38 /* A bucket in the symbol hash-table. Primarily, maps symbol names to
39 * absolute addresses. All symbols from a given module are linked
40 * together, so they can be freed at the same time. There's also a
41 * bucket link field for the hash table.
43 typedef struct _SymbolVal {
48 typedef enum { OBJECT_LOADED, OBJECT_RESOLVED } OStatus;
50 /* Indication of section kinds for loaded objects. Needed by
51 the GC for deciding whether or not a pointer on the stack
54 typedef enum { SECTIONKIND_CODE_OR_RODATA,
57 SECTIONKIND_NOINFOAVAIL }
60 typedef struct { void* start; void* end; SectionKind kind; }
63 /* Top-level structure for an object module. One of these is allocated
64 * for each object file in use.
66 typedef struct _ObjectCode {
70 char* formatName; /* eg "ELF32", "DLL", "COFF", etc. */
75 /* ptr to malloc'd lump of memory holding the obj file */
78 /* The section-kind entries for this object module. Dynamically expands. */
82 /* Allow a chain of these things */
83 struct _ObjectCode * next;
87 /* Hash table mapping symbol names to Symbol */
88 /*Str*/HashTable *symhash;
90 /* List of currently loaded objects */
93 #if defined(OBJFORMAT_ELF)
94 static int ocVerifyImage_ELF ( ObjectCode* oc );
95 static int ocGetNames_ELF ( ObjectCode* oc );
96 static int ocResolve_ELF ( ObjectCode* oc );
97 #elif defined(OBJFORMAT_PEi386)
98 static int ocVerifyImage_PEi386 ( ObjectCode* oc );
99 static int ocGetNames_PEi386 ( ObjectCode* oc );
100 static int ocResolve_PEi386 ( ObjectCode* oc );
103 /* -----------------------------------------------------------------------------
104 * Built-in symbols from the RTS
107 #define RTS_SYMBOLS \
109 Sym(stg_gc_enter_1) \
116 Sym(stg_gc_unbx_r1) \
121 SymX(stg_update_PAP) \
122 SymX(stg_ap_2_upd_info) \
123 SymX(stg_ap_3_upd_info) \
124 SymX(stg_ap_4_upd_info) \
125 SymX(stg_ap_5_upd_info) \
126 SymX(stg_ap_6_upd_info) \
127 SymX(stg_ap_7_upd_info) \
128 SymX(stg_ap_8_upd_info) \
129 SymX(stg_sel_0_upd_info) \
130 SymX(stg_sel_1_upd_info) \
131 SymX(stg_sel_2_upd_info) \
132 SymX(stg_sel_3_upd_info) \
133 SymX(stg_sel_4_upd_info) \
134 SymX(stg_sel_5_upd_info) \
135 SymX(stg_sel_6_upd_info) \
136 SymX(stg_sel_7_upd_info) \
137 SymX(stg_sel_8_upd_info) \
138 SymX(stg_sel_9_upd_info) \
139 SymX(stg_sel_10_upd_info) \
140 SymX(stg_sel_11_upd_info) \
141 SymX(stg_sel_12_upd_info) \
142 SymX(stg_sel_13_upd_info) \
143 SymX(stg_sel_14_upd_info) \
144 SymX(stg_sel_15_upd_info) \
145 SymX(stg_upd_frame_info) \
146 SymX(stg_seq_frame_info) \
147 SymX(stg_CAF_BLACKHOLE_info) \
148 SymX(stg_IND_STATIC_info) \
149 SymX(stg_EMPTY_MVAR_info) \
150 SymX(stg_MUT_ARR_PTRS_FROZEN_info) \
151 SymX(stg_WEAK_info) \
152 SymX(stg_CHARLIKE_closure) \
153 SymX(stg_INTLIKE_closure) \
155 SymX(newBCOzh_fast) \
156 SymX(mkApUpd0zh_fast) \
157 SymX(putMVarzh_fast) \
158 SymX(newMVarzh_fast) \
159 SymX(takeMVarzh_fast) \
160 SymX(tryTakeMVarzh_fast) \
166 SymX(killThreadzh_fast) \
167 SymX(waitReadzh_fast) \
168 SymX(waitWritezh_fast) \
169 SymX(suspendThread) \
171 SymX(stackOverflow) \
172 SymX(int2Integerzh_fast) \
173 SymX(word2Integerzh_fast) \
174 SymX(mkForeignObjzh_fast) \
175 SymX(__encodeDouble) \
176 SymX(decodeDoublezh_fast) \
177 SymX(decodeFloatzh_fast) \
178 SymX(gcdIntegerzh_fast) \
179 SymX(newArrayzh_fast) \
180 SymX(unsafeThawArrayzh_fast) \
181 SymX(newByteArrayzh_fast) \
182 SymX(newMutVarzh_fast) \
183 SymX(quotRemIntegerzh_fast) \
184 SymX(quotIntegerzh_fast) \
185 SymX(remIntegerzh_fast) \
186 SymX(divExactIntegerzh_fast) \
187 SymX(divModIntegerzh_fast) \
188 SymX(timesIntegerzh_fast) \
189 SymX(minusIntegerzh_fast) \
190 SymX(plusIntegerzh_fast) \
191 SymX(andIntegerzh_fast) \
192 SymX(orIntegerzh_fast) \
193 SymX(xorIntegerzh_fast) \
194 SymX(complementIntegerzh_fast) \
195 SymX(mkWeakzh_fast) \
196 SymX(makeStableNamezh_fast) \
197 SymX(finalizzeWeakzh_fast) \
198 SymX(blockAsyncExceptionszh_fast) \
199 SymX(unblockAsyncExceptionszh_fast) \
201 SymX(isDoubleInfinite) \
202 SymX(isDoubleDenormalized) \
203 SymX(isDoubleNegativeZero) \
204 SymX(__encodeFloat) \
206 SymX(isFloatInfinite) \
207 SymX(isFloatDenormalized) \
208 SymX(isFloatNegativeZero) \
209 SymX(__int_encodeFloat) \
210 SymX(__int_encodeDouble) \
211 SymX(__gmpz_cmp_si) \
212 SymX(__gmpz_cmp_ui) \
217 SymX(resetNonBlockingFd) \
219 SymX(stable_ptr_table) \
220 SymX(shutdownHaskellAndExit) \
221 Sym(stg_enterStackTop) \
222 Sym(stg_yield_to_interpreter) \
226 Sym(__init_PrelGHC) \
227 SymX(freeHaskellFunctionPtr) \
230 SymX(NoRunnableThreadsHook) \
231 SymX(StackOverflowHook) \
232 SymX(OutOfHeapHook) \
233 SymX(MallocFailHook) \
234 SymX(PatErrorHdrHook) \
237 SymX(PostTraceHook) \
238 SymX(stg_sig_install) \
240 SymX(createAdjustor) \
242 SymX(rts_mkStablePtr) \
245 SymX(rts_checkSchedStatus) \
248 #ifndef SUPPORT_LONG_LONGS
249 #define RTS_LONG_LONG_SYMS /* nothing */
251 #define RTS_LONG_LONG_SYMS \
264 SymX(stg_remWord64) \
265 SymX(stg_quotWord64) \
267 SymX(stg_quotInt64) \
268 SymX(stg_negateInt64) \
269 SymX(stg_plusInt64) \
270 SymX(stg_minusInt64) \
271 SymX(stg_timesInt64) \
277 SymX(stg_shiftRL64) \
278 SymX(stg_iShiftL64) \
279 SymX(stg_iShiftRL64) \
280 SymX(stg_iShiftRA64) \
281 SymX(stg_intToInt64) \
282 SymX(stg_int64ToInt) \
283 SymX(stg_int64ToWord64) \
284 SymX(stg_wordToWord64) \
285 SymX(stg_word64ToWord) \
286 SymX(stg_word64ToInt64) \
287 SymX(int64ToIntegerzh_fast) \
288 SymX(word64ToIntegerzh_fast)
289 #endif /* SUPPORT_LONG_LONGS */
291 /* entirely bogus claims about types of these symbols */
292 #define Sym(vvv) extern void (vvv);
293 #define SymX(vvv) /**/
298 #ifdef LEADING_UNDERSCORE
299 #define MAYBE_LEADING_UNDERSCORE_STR(s) ("_" s)
301 #define MAYBE_LEADING_UNDERSCORE_STR(s) (s)
304 #define Sym(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
306 #define SymX(vvv) Sym(vvv)
308 static SymbolVal rtsSyms[] = {
311 { 0, 0 } /* sentinel */
314 /* -----------------------------------------------------------------------------
315 * initialize the object linker
317 static void *dl_prog_handle;
324 symhash = allocStrHashTable();
326 /* populate the symbol table with stuff from the RTS */
327 for (sym = rtsSyms; sym->lbl != NULL; sym++) {
328 insertStrHashTable(symhash, sym->lbl, sym);
331 dl_prog_handle = dlopen(NULL, RTLD_LAZY);
334 /* -----------------------------------------------------------------------------
335 * lookup a symbol in the hash table
338 lookupSymbol( char *lbl )
341 val = lookupStrHashTable(symhash, lbl);
344 return dlsym(dl_prog_handle, lbl);
350 /* -----------------------------------------------------------------------------
351 * Load an obj (populate the global symbol table, but don't resolve yet)
353 * Returns: 1 if ok, 0 on error.
356 loadObj( char *path )
364 /* assert that we haven't already loaded this object */
367 for (o = objects; o; o = o->next)
368 ASSERT(strcmp(o->fileName, path));
372 oc = stgMallocBytes(sizeof(ObjectCode), "loadObj(oc)");
374 # if defined(OBJFORMAT_ELF)
375 oc->formatName = "ELF";
376 # elif defined(OBJFORMAT_PEi386)
377 oc->formatName = "PEi386";
380 barf("loadObj: not implemented on this platform");
384 if (r == -1) { return 0; }
387 oc->fileSize = st.st_size;
388 oc->image = stgMallocBytes( st.st_size, "loadObj(image)" );
392 /* chain it onto the list of objects */
396 /* load the image into memory */
397 f = fopen(path, "rb");
399 barf("loadObj: can't read `%s'", path);
401 n = fread ( oc->image, 1, oc->fileSize, f );
402 if (n != oc->fileSize) {
404 barf("loadObj: error whilst reading `%s'", path);
407 /* verify the in-memory image */
408 # if defined(OBJFORMAT_ELF)
409 r = ocVerifyImage_ELF ( oc );
410 # elif defined(OBJFORMAT_PEi386)
411 r = ocVerifyImage_PEi386 ( oc );
413 barf("loadObj: no verify method");
415 if (!r) { return r; }
417 /* build the symbol list for this image */
418 # if defined(OBJFORMAT_ELF)
419 r = ocGetNames_ELF ( oc );
420 # elif defined(OBJFORMAT_PEi386)
421 r = ocGetNames_PEi386 ( oc );
423 barf("loadObj: no getNames method");
425 if (!r) { return r; }
427 /* loaded, but not resolved yet */
428 oc->status = OBJECT_LOADED;
433 /* -----------------------------------------------------------------------------
434 * resolve all the currently unlinked objects in memory
436 * Returns: 1 if ok, 0 on error.
444 for (oc = objects; oc; oc = oc->next) {
445 if (oc->status != OBJECT_RESOLVED) {
446 # if defined(OBJFORMAT_ELF)
447 r = ocResolve_ELF ( oc );
448 # elif defined(OBJFORMAT_PEi386)
449 r = ocResolve_PEi386 ( oc );
451 barf("link: not implemented on this platform");
453 if (!r) { return r; }
454 oc->status = OBJECT_RESOLVED;
460 /* -----------------------------------------------------------------------------
461 * delete an object from the pool
464 unloadObj( char *path )
468 for (oc = objects; oc; oc = oc->next) {
469 if (!strcmp(oc->fileName,path)) {
471 /* Remove all the mappings for the symbols within this
476 for (s = oc->symbols; s < oc->symbols + oc->n_symbols; s++) {
477 if (s->lbl != NULL) {
478 removeStrHashTable(symhash, s->lbl, NULL);
483 /* We're going to leave this in place, in case there are
484 any pointers from the heap into it: */
485 /* free(oc->image); */
493 belch("unloadObj: can't find `%s' to unload", path);
497 /* --------------------------------------------------------------------------
498 * PEi386 specifics (Win32 targets)
499 * ------------------------------------------------------------------------*/
501 /* The information for this linker comes from
502 Microsoft Portable Executable
503 and Common Object File Format Specification
504 revision 5.1 January 1998
505 which SimonM says comes from the MS Developer Network CDs.
509 #if defined(OBJFORMAT_PEi386)
513 typedef unsigned char UChar;
514 typedef unsigned short UInt16;
515 typedef unsigned int UInt32;
522 UInt16 NumberOfSections;
523 UInt32 TimeDateStamp;
524 UInt32 PointerToSymbolTable;
525 UInt32 NumberOfSymbols;
526 UInt16 SizeOfOptionalHeader;
527 UInt16 Characteristics;
531 #define sizeof_COFF_header 20
538 UInt32 VirtualAddress;
539 UInt32 SizeOfRawData;
540 UInt32 PointerToRawData;
541 UInt32 PointerToRelocations;
542 UInt32 PointerToLinenumbers;
543 UInt16 NumberOfRelocations;
544 UInt16 NumberOfLineNumbers;
545 UInt32 Characteristics;
549 #define sizeof_COFF_section 40
556 UInt16 SectionNumber;
559 UChar NumberOfAuxSymbols;
563 #define sizeof_COFF_symbol 18
568 UInt32 VirtualAddress;
569 UInt32 SymbolTableIndex;
574 #define sizeof_COFF_reloc 10
577 /* From PE spec doc, section 3.3.2 */
578 #define IMAGE_FILE_RELOCS_STRIPPED 0x0001
579 #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
580 #define IMAGE_FILE_DLL 0x2000
581 #define IMAGE_FILE_SYSTEM 0x1000
582 #define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
583 #define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
584 #define IMAGE_FILE_32BIT_MACHINE 0x0100
586 /* From PE spec doc, section 5.4.2 and 5.4.4 */
587 #define IMAGE_SYM_CLASS_EXTERNAL 2
588 #define IMAGE_SYM_CLASS_STATIC 3
589 #define IMAGE_SYM_UNDEFINED 0
591 /* From PE spec doc, section 4.1 */
592 #define IMAGE_SCN_CNT_CODE 0x00000020
593 #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
595 /* From PE spec doc, section 5.2.1 */
596 #define IMAGE_REL_I386_DIR32 0x0006
597 #define IMAGE_REL_I386_REL32 0x0014
600 /* We use myindex to calculate array addresses, rather than
601 simply doing the normal subscript thing. That's because
602 some of the above structs have sizes which are not
603 a whole number of words. GCC rounds their sizes up to a
604 whole number of words, which means that the address calcs
605 arising from using normal C indexing or pointer arithmetic
606 are just plain wrong. Sigh.
609 myindex ( int scale, int index, void* base )
612 ((UChar*)base) + scale * index;
617 printName ( UChar* name, UChar* strtab )
619 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
620 UInt32 strtab_offset = * (UInt32*)(name+4);
621 fprintf ( stderr, "%s", strtab + strtab_offset );
624 for (i = 0; i < 8; i++) {
625 if (name[i] == 0) break;
626 fprintf ( stderr, "%c", name[i] );
633 copyName ( UChar* name, UChar* strtab, UChar* dst, int dstSize )
635 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
636 UInt32 strtab_offset = * (UInt32*)(name+4);
637 strncpy ( dst, strtab+strtab_offset, dstSize );
643 if (name[i] == 0) break;
653 cstring_from_COFF_symbol_name ( UChar* name, UChar* strtab )
656 /* If the string is longer than 8 bytes, look in the
657 string table for it -- this will be correctly zero terminated.
659 if (name[0]==0 && name[1]==0 && name[2]==0 && name[3]==0) {
660 UInt32 strtab_offset = * (UInt32*)(name+4);
661 return ((UChar*)strtab) + strtab_offset;
663 /* Otherwise, if shorter than 8 bytes, return the original,
664 which by defn is correctly terminated.
666 if (name[7]==0) return name;
667 /* The annoying case: 8 bytes. Copy into a temporary
668 (which is never freed ...)
672 strncpy(newstr,name,8);
679 /* Just compares the short names (first 8 chars) */
680 static COFF_section *
681 findPEi386SectionCalled ( ObjectCode* oc, char* name )
685 = (COFF_header*)(oc->image);
688 ((UChar*)(oc->image))
689 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
691 for (i = 0; i < hdr->NumberOfSections; i++) {
694 COFF_section* section_i
696 myindex ( sizeof_COFF_section, i, sectab );
697 n1 = (UChar*) &(section_i->Name);
699 if (n1[0]==n2[0] && n1[1]==n2[1] && n1[2]==n2[2] &&
700 n1[3]==n2[3] && n1[4]==n2[4] && n1[5]==n2[5] &&
701 n1[6]==n2[6] && n1[7]==n2[7])
710 zapTrailingAtSign ( UChar* sym )
713 if (sym[0] == 0) return;
715 while (sym[i] != 0) i++;
718 while (j > 0 && isdigit(sym[j])) j--;
719 if (j > 0 && sym[j] == '@' && j != i) sym[j] = 0;
724 ocVerifyImage_PEi386 ( ObjectCode* oc )
728 COFF_section* sectab;
732 hdr = (COFF_header*)(oc->image);
733 sectab = (COFF_section*) (
734 ((UChar*)(oc->image))
735 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
737 symtab = (COFF_symbol*) (
738 ((UChar*)(oc->image))
739 + hdr->PointerToSymbolTable
741 strtab = ((UChar*)(oc->image))
742 + hdr->PointerToSymbolTable
743 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
745 if (hdr->Machine != 0x14c) {
746 oc->errMsg("Not x86 PEi386");
749 if (hdr->SizeOfOptionalHeader != 0) {
750 oc->errMsg("PEi386 with nonempty optional header");
753 if ( /* (hdr->Characteristics & IMAGE_FILE_RELOCS_STRIPPED) || */
754 (hdr->Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) ||
755 (hdr->Characteristics & IMAGE_FILE_DLL) ||
756 (hdr->Characteristics & IMAGE_FILE_SYSTEM) ) {
757 oc->errMsg("Not a PEi386 object file");
760 if ( (hdr->Characteristics & IMAGE_FILE_BYTES_REVERSED_HI) ||
761 !(hdr->Characteristics & IMAGE_FILE_32BIT_MACHINE) ) {
762 oc->errMsg("Invalid PEi386 word size or endiannness");
766 if (!verb) return TRUE;
767 /* No further verification after this point; only debug printing. */
770 "sectab offset = %d\n", ((UChar*)sectab) - ((UChar*)hdr) );
772 "symtab offset = %d\n", ((UChar*)symtab) - ((UChar*)hdr) );
774 "strtab offset = %d\n", ((UChar*)strtab) - ((UChar*)hdr) );
776 fprintf ( stderr, "\n" );
778 "Machine: 0x%x\n", (UInt32)(hdr->Machine) );
780 "# sections: %d\n", (UInt32)(hdr->NumberOfSections) );
782 "time/date: 0x%x\n", (UInt32)(hdr->TimeDateStamp) );
784 "symtab offset: %d\n", (UInt32)(hdr->PointerToSymbolTable) );
786 "# symbols: %d\n", (UInt32)(hdr->NumberOfSymbols) );
788 "sz of opt hdr: %d\n", (UInt32)(hdr->SizeOfOptionalHeader) );
790 "characteristics: 0x%x\n", (UInt32)(hdr->Characteristics) );
792 fprintf ( stderr, "\n" );
793 fprintf ( stderr, "string table has size 0x%x\n", * (UInt32*)strtab );
794 fprintf ( stderr, "---START of string table---\n");
795 for (i = 4; i < *(UInt32*)strtab; i++) {
797 fprintf ( stderr, "\n"); else
798 fprintf( stderr, "%c", strtab[i] );
800 fprintf ( stderr, "--- END of string table---\n");
802 fprintf ( stderr, "\n" );
803 for (i = 0; i < hdr->NumberOfSections; i++) {
805 COFF_section* sectab_i
807 myindex ( sizeof_COFF_section, i, sectab );
814 printName ( sectab_i->Name, strtab );
823 sectab_i->VirtualSize,
824 sectab_i->VirtualAddress,
825 sectab_i->SizeOfRawData,
826 sectab_i->PointerToRawData,
827 sectab_i->NumberOfRelocations,
828 sectab_i->PointerToRelocations
830 reltab = (COFF_reloc*) (
831 ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
833 for (j = 0; j < sectab_i->NumberOfRelocations; j++) {
835 COFF_reloc* rel = (COFF_reloc*)
836 myindex ( sizeof_COFF_reloc, j, reltab );
838 " type 0x%-4x vaddr 0x%-8x name `",
840 rel->VirtualAddress );
842 myindex ( sizeof_COFF_symbol, rel->SymbolTableIndex, symtab );
843 printName ( sym->Name, strtab );
844 fprintf ( stderr, "'\n" );
846 fprintf ( stderr, "\n" );
850 fprintf ( stderr, "\n" );
853 COFF_symbol* symtab_i;
854 if (i >= hdr->NumberOfSymbols) break;
855 symtab_i = (COFF_symbol*)
856 myindex ( sizeof_COFF_symbol, i, symtab );
862 printName ( symtab_i->Name, strtab );
871 (Int32)(symtab_i->SectionNumber) - 1,
872 (UInt32)symtab_i->Type,
873 (UInt32)symtab_i->StorageClass,
874 (UInt32)symtab_i->NumberOfAuxSymbols
876 i += symtab_i->NumberOfAuxSymbols;
880 fprintf ( stderr, "\n" );
887 ocGetNames_PEi386 ( ObjectCode* oc )
890 COFF_section* sectab;
898 hdr = (COFF_header*)(oc->image);
899 sectab = (COFF_section*) (
900 ((UChar*)(oc->image))
901 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
903 symtab = (COFF_symbol*) (
904 ((UChar*)(oc->image))
905 + hdr->PointerToSymbolTable
907 strtab = ((UChar*)(oc->image))
908 + hdr->PointerToSymbolTable
909 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
911 /* Copy exported symbols into the ObjectCode. */
914 COFF_symbol* symtab_i;
915 if (i >= hdr->NumberOfSymbols) break;
916 symtab_i = (COFF_symbol*)
917 myindex ( sizeof_COFF_symbol, i, symtab );
919 if (symtab_i->StorageClass == IMAGE_SYM_CLASS_EXTERNAL &&
920 symtab_i->SectionNumber != IMAGE_SYM_UNDEFINED) {
922 /* This symbol is global and defined, viz, exported */
923 COFF_section* sectabent;
925 sname = cstring_from_COFF_symbol_name (
926 symtab_i->Name, strtab
929 oc->errMsg("Out of memory when copying PEi386 symbol");
933 /* for IMAGE_SYMCLASS_EXTERNAL
934 && !IMAGE_SYM_UNDEFINED,
935 the address of the symbol is:
936 address of relevant section + offset in section
938 sectabent = (COFF_section*)
939 myindex ( sizeof_COFF_section,
940 symtab_i->SectionNumber-1,
942 addr = ((UChar*)(oc->image))
943 + (sectabent->PointerToRawData
945 /* fprintf ( stderr, "addSymbol %p `%s'\n", addr,sname); */
946 if (!addSymbol(oc,sname,addr)) return FALSE;
948 i += symtab_i->NumberOfAuxSymbols;
952 oc->sections = stgMallocBytes( NumberOfSections * sizeof(Section),
953 "ocGetNamesPEi386" );
955 /* Copy section information into the ObjectCode. */
956 for (i = 0; i < hdr->NumberOfSections; i++) {
962 COFF_section* sectab_i
964 myindex ( sizeof_COFF_section, i, sectab );
965 /* fprintf ( stderr, "section name = %s\n", sectab_i->Name ); */
968 /* I'm sure this is the Right Way to do it. However, the
969 alternative of testing the sectab_i->Name field seems to
972 if (sectab_i->Characteristics & IMAGE_SCN_CNT_CODE ||
973 sectab_i->Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA)
974 kind = SECTIONKIND_CODE_OR_RODATA;
977 if (0==strcmp(".text",sectab_i->Name))
978 kind = SECTIONKIND_CODE_OR_RODATA;
979 if (0==strcmp(".data",sectab_i->Name) ||
980 0==strcmp(".bss",sectab_i->Name))
981 kind = SECTIONKIND_RWDATA;
983 start = ((UChar*)(oc->image))
984 + sectab_i->PointerToRawData;
986 + sectab_i->SizeOfRawData - 1;
988 if (kind != SECTIONKIND_OTHER) {
989 addSection ( oc, start, end, kind );
991 fprintf ( stderr, "unknown section name = `%s'\n",
993 oc->errMsg("Unknown PEi386 section name");
1003 ocResolve_PEi386 ( ObjectCode* oc, int verb )
1006 COFF_section* sectab;
1007 COFF_symbol* symtab;
1015 char symbol[1000]; // ToDo
1017 hdr = (COFF_header*)(oc->image);
1018 sectab = (COFF_section*) (
1019 ((UChar*)(oc->image))
1020 + sizeof_COFF_header + hdr->SizeOfOptionalHeader
1022 symtab = (COFF_symbol*) (
1023 ((UChar*)(oc->image))
1024 + hdr->PointerToSymbolTable
1026 strtab = ((UChar*)(oc->image))
1027 + hdr->PointerToSymbolTable
1028 + hdr->NumberOfSymbols * sizeof_COFF_symbol;
1030 for (i = 0; i < hdr->NumberOfSections; i++) {
1031 COFF_section* sectab_i
1033 myindex ( sizeof_COFF_section, i, sectab );
1036 ((UChar*)(oc->image)) + sectab_i->PointerToRelocations
1038 for (j = 0; j < sectab_i->NumberOfRelocations; j++) {
1040 COFF_reloc* reltab_j
1042 myindex ( sizeof_COFF_reloc, j, reltab );
1044 /* the location to patch */
1046 ((UChar*)(oc->image))
1047 + (sectab_i->PointerToRawData
1048 + reltab_j->VirtualAddress)
1050 /* the existing contents of pP */
1052 /* the symbol to connect to */
1053 sym = (COFF_symbol*)
1054 myindex ( sizeof_COFF_symbol,
1055 reltab_j->SymbolTableIndex, symtab );
1058 "reloc sec %2d num %3d: type 0x%-4x "
1059 "vaddr 0x%-8x name `",
1061 (UInt32)reltab_j->Type,
1062 reltab_j->VirtualAddress );
1063 printName ( sym->Name, strtab );
1064 fprintf ( stderr, "'\n" );
1067 if (sym->StorageClass == IMAGE_SYM_CLASS_STATIC) {
1068 COFF_section* section_sym
1069 = findPEi386SectionCalled ( oc, sym->Name );
1071 fprintf ( stderr, "bad section = `%s'\n", sym->Name );
1072 oc->errMsg("Can't find abovementioned PEi386 section");
1075 S = ((UInt32)(oc->image))
1076 + (section_sym->PointerToRawData
1079 copyName ( sym->Name, strtab, symbol, 1000 );
1080 zapTrailingAtSign ( symbol );
1081 S = (UInt32) ocLookupSym ( oc, symbol );
1083 S = (UInt32)(oc->clientLookup ( symbol ));
1085 belch("%s: unresolvable reference to `%s'", oc->fileName, symbol);
1090 switch (reltab_j->Type) {
1091 case IMAGE_REL_I386_DIR32:
1094 case IMAGE_REL_I386_REL32:
1095 /* Tricky. We have to insert a displacement at
1096 pP which, when added to the PC for the _next_
1097 insn, gives the address of the target (S).
1098 Problem is to know the address of the next insn
1099 when we only know pP. We assume that this
1100 literal field is always the last in the insn,
1101 so that the address of the next insn is pP+4
1102 -- hence the constant 4.
1103 Also I don't know if A should be added, but so
1104 far it has always been zero.
1107 *pP = S - ((UInt32)pP) - 4;
1111 "unhandled PEi386 relocation type %d\n",
1113 oc->errMsg("unhandled PEi386 relocation type");
1123 #endif /* defined(OBJFORMAT_PEi386) */
1126 /* --------------------------------------------------------------------------
1128 * ------------------------------------------------------------------------*/
1130 #if defined(OBJFORMAT_ELF)
1138 findElfSection ( void* objImage, Elf32_Word sh_type )
1141 char* ehdrC = (char*)objImage;
1142 Elf32_Ehdr* ehdr = ( Elf32_Ehdr*)ehdrC;
1143 Elf32_Shdr* shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
1145 for (i = 0; i < ehdr->e_shnum; i++) {
1146 if (shdr[i].sh_type == sh_type &&
1147 i != ehdr->e_shstrndx) {
1148 ptr = ehdrC + shdr[i].sh_offset;
1157 ocVerifyImage_ELF ( ObjectCode* oc )
1161 int i, j, nent, nstrtab, nsymtabs;
1165 char* ehdrC = (char*)(oc->image);
1166 Elf32_Ehdr* ehdr = ( Elf32_Ehdr*)ehdrC;
1168 if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
1169 ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
1170 ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
1171 ehdr->e_ident[EI_MAG3] != ELFMAG3) {
1172 belch("ocVerifyImage_ELF: not an ELF header");
1175 IF_DEBUG(linker,belch( "Is an ELF header" ));
1177 if (ehdr->e_ident[EI_CLASS] != ELFCLASS32) {
1178 belch("ocVerifyImage_ELF: not 32 bit ELF" );
1182 IF_DEBUG(linker,belch( "Is 32 bit ELF" ));
1184 if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
1185 IF_DEBUG(linker,belch( "Is little-endian" ));
1187 if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
1188 IF_DEBUG(linker,belch( "Is big-endian" ));
1190 belch("ocVerifyImage_ELF: unknown endiannness");
1194 if (ehdr->e_type != ET_REL) {
1195 belch("ocVerifyImage_ELF: not a relocatable object (.o) file");
1198 IF_DEBUG(linker, belch( "Is a relocatable object (.o) file" ));
1200 IF_DEBUG(linker,belch( "Architecture is " ));
1201 switch (ehdr->e_machine) {
1202 case EM_386: IF_DEBUG(linker,belch( "x86" )); break;
1203 case EM_SPARC: IF_DEBUG(linker,belch( "sparc" )); break;
1204 default: IF_DEBUG(linker,belch( "unknown" ));
1205 belch("ocVerifyImage_ELF: unknown architecture");
1209 IF_DEBUG(linker,belch(
1210 "\nSection header table: start %d, n_entries %d, ent_size %d",
1211 ehdr->e_shoff, ehdr->e_shnum, ehdr->e_shentsize ));
1213 ASSERT (ehdr->e_shentsize == sizeof(Elf32_Shdr));
1215 shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
1217 if (ehdr->e_shstrndx == SHN_UNDEF) {
1218 belch("ocVerifyImage_ELF: no section header string table");
1221 IF_DEBUG(linker,belch( "Section header string table is section %d",
1223 sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
1226 for (i = 0; i < ehdr->e_shnum; i++) {
1227 IF_DEBUG(linker,fprintf(stderr, "%2d: ", i ));
1228 IF_DEBUG(linker,fprintf(stderr, "type=%2d ", shdr[i].sh_type ));
1229 IF_DEBUG(linker,fprintf(stderr, "size=%4d ", shdr[i].sh_size ));
1230 IF_DEBUG(linker,fprintf(stderr, "offs=%4d ", shdr[i].sh_offset ));
1231 IF_DEBUG(linker,fprintf(stderr, " (%p .. %p) ",
1232 ehdrC + shdr[i].sh_offset,
1233 ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1));
1235 if (shdr[i].sh_type == SHT_REL) {
1236 IF_DEBUG(linker,fprintf(stderr, "Rel " ));
1237 } else if (shdr[i].sh_type == SHT_RELA) {
1238 IF_DEBUG(linker,fprintf(stderr, "RelA " ));
1240 IF_DEBUG(linker,fprintf(stderr," "));
1243 IF_DEBUG(linker,fprintf(stderr, "sname=%s\n", sh_strtab + shdr[i].sh_name ));
1247 IF_DEBUG(linker,belch( "\nString tables" ));
1250 for (i = 0; i < ehdr->e_shnum; i++) {
1251 if (shdr[i].sh_type == SHT_STRTAB &&
1252 i != ehdr->e_shstrndx) {
1253 IF_DEBUG(linker,belch(" section %d is a normal string table", i ));
1254 strtab = ehdrC + shdr[i].sh_offset;
1259 belch("ocVerifyImage_ELF: no string tables, or too many");
1264 IF_DEBUG(linker,belch( "\nSymbol tables" ));
1265 for (i = 0; i < ehdr->e_shnum; i++) {
1266 if (shdr[i].sh_type != SHT_SYMTAB) continue;
1267 IF_DEBUG(linker,belch( "section %d is a symbol table", i ));
1269 stab = (Elf32_Sym*) (ehdrC + shdr[i].sh_offset);
1270 nent = shdr[i].sh_size / sizeof(Elf32_Sym);
1271 IF_DEBUG(linker,belch( " number of entries is apparently %d (%d rem)",
1273 shdr[i].sh_size % sizeof(Elf32_Sym)
1275 if (0 != shdr[i].sh_size % sizeof(Elf32_Sym)) {
1276 belch("ocVerifyImage_ELF: non-integral number of symbol table entries");
1279 for (j = 0; j < nent; j++) {
1280 IF_DEBUG(linker,fprintf(stderr, " %2d ", j ));
1281 IF_DEBUG(linker,fprintf(stderr, " sec=%-5d size=%-3d val=%5p ",
1282 (int)stab[j].st_shndx,
1283 (int)stab[j].st_size,
1284 (char*)stab[j].st_value ));
1286 IF_DEBUG(linker,fprintf(stderr, "type=" ));
1287 switch (ELF32_ST_TYPE(stab[j].st_info)) {
1288 case STT_NOTYPE: IF_DEBUG(linker,fprintf(stderr, "notype " )); break;
1289 case STT_OBJECT: IF_DEBUG(linker,fprintf(stderr, "object " )); break;
1290 case STT_FUNC : IF_DEBUG(linker,fprintf(stderr, "func " )); break;
1291 case STT_SECTION: IF_DEBUG(linker,fprintf(stderr, "section" )); break;
1292 case STT_FILE: IF_DEBUG(linker,fprintf(stderr, "file " )); break;
1293 default: IF_DEBUG(linker,fprintf(stderr, "? " )); break;
1295 IF_DEBUG(linker,fprintf(stderr, " " ));
1297 IF_DEBUG(linker,fprintf(stderr, "bind=" ));
1298 switch (ELF32_ST_BIND(stab[j].st_info)) {
1299 case STB_LOCAL : IF_DEBUG(linker,fprintf(stderr, "local " )); break;
1300 case STB_GLOBAL: IF_DEBUG(linker,fprintf(stderr, "global" )); break;
1301 case STB_WEAK : IF_DEBUG(linker,fprintf(stderr, "weak " )); break;
1302 default: IF_DEBUG(linker,fprintf(stderr, "? " )); break;
1304 IF_DEBUG(linker,fprintf(stderr, " " ));
1306 IF_DEBUG(linker,fprintf(stderr, "name=%s\n", strtab + stab[j].st_name ));
1310 if (nsymtabs == 0) {
1311 belch("ocVerifyImage_ELF: didn't find any symbol tables");
1320 ocGetNames_ELF ( ObjectCode* oc )
1325 char* ehdrC = (char*)(oc->image);
1326 Elf32_Ehdr* ehdr = (Elf32_Ehdr*)ehdrC;
1327 char* strtab = findElfSection ( ehdrC, SHT_STRTAB );
1328 Elf32_Shdr* shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
1329 char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
1332 belch("ocGetNames_ELF: no strtab");
1337 oc->sections = stgMallocBytes( ehdr->e_shnum * sizeof(Section),
1339 oc->n_sections = ehdr->e_shnum;
1341 for (i = 0; i < ehdr->e_shnum; i++) {
1343 /* make a section entry for relevant sections */
1344 SectionKind kind = SECTIONKIND_OTHER;
1345 if (!strcmp(".data",sh_strtab+shdr[i].sh_name) ||
1346 !strcmp(".data1",sh_strtab+shdr[i].sh_name))
1347 kind = SECTIONKIND_RWDATA;
1348 if (!strcmp(".text",sh_strtab+shdr[i].sh_name) ||
1349 !strcmp(".rodata",sh_strtab+shdr[i].sh_name) ||
1350 !strcmp(".rodata1",sh_strtab+shdr[i].sh_name))
1351 kind = SECTIONKIND_CODE_OR_RODATA;
1353 /* fill in the section info */
1354 oc->sections[i].start = ehdrC + shdr[i].sh_offset;
1355 oc->sections[i].end = ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1;
1356 oc->sections[i].kind = kind;
1358 if (shdr[i].sh_type != SHT_SYMTAB) continue;
1360 /* copy stuff into this module's object symbol table */
1361 stab = (Elf32_Sym*) (ehdrC + shdr[i].sh_offset);
1362 nent = shdr[i].sh_size / sizeof(Elf32_Sym);
1363 oc->symbols = malloc(nent * sizeof(SymbolVal));
1364 oc->n_symbols = nent;
1365 for (j = 0; j < nent; j++) {
1366 if ( ( ELF32_ST_BIND(stab[j].st_info)==STB_GLOBAL /* ||
1367 ELF32_ST_BIND(stab[j].st_info)==STB_LOCAL */
1369 /* and not an undefined symbol */
1370 && stab[j].st_shndx != SHN_UNDEF
1372 /* and it's a not a section or string table or anything silly */
1373 ( ELF32_ST_TYPE(stab[j].st_info)==STT_FUNC ||
1374 ELF32_ST_TYPE(stab[j].st_info)==STT_OBJECT ||
1375 ELF32_ST_TYPE(stab[j].st_info)==STT_NOTYPE )
1377 char* nm = strtab + stab[j].st_name;
1379 + shdr[ stab[j].st_shndx ].sh_offset
1383 IF_DEBUG(linker,belch( "addOTabName: %10p %s %s",
1384 ad, oc->fileName, nm ));
1385 oc->symbols[j].lbl = nm;
1386 oc->symbols[j].addr = ad;
1387 insertStrHashTable(symhash, nm, &(oc->symbols[j]));
1390 IF_DEBUG(linker,belch( "skipping `%s'", strtab +
1392 oc->symbols[j].lbl = NULL;
1393 oc->symbols[j].addr = NULL;
1403 ocResolve_ELF ( ObjectCode* oc )
1405 char *strtab, *symbol;
1407 Elf32_Sym* stab = NULL;
1408 char* ehdrC = (char*)(oc->image);
1409 Elf32_Ehdr* ehdr = (Elf32_Ehdr*) ehdrC;
1410 Elf32_Shdr* shdr = (Elf32_Shdr*) (ehdrC + ehdr->e_shoff);
1413 /* first find "the" symbol table */
1414 stab = (Elf32_Sym*) findElfSection ( ehdrC, SHT_SYMTAB );
1416 /* also go find the string table */
1417 strtab = findElfSection ( ehdrC, SHT_STRTAB );
1419 if (stab == NULL || strtab == NULL) {
1420 belch("ocResolve_ELF: can't find string or symbol table");
1424 for (i = 0; i < ehdr->e_shnum; i++) {
1425 if (shdr[i].sh_type == SHT_REL ) {
1426 Elf32_Rel* rtab = (Elf32_Rel*) (ehdrC + shdr[i].sh_offset);
1427 int nent = shdr[i].sh_size / sizeof(Elf32_Rel);
1428 int target_shndx = shdr[i].sh_info;
1429 int symtab_shndx = shdr[i].sh_link;
1430 stab = (Elf32_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
1431 targ = (Elf32_Word*)(ehdrC + shdr[ target_shndx ].sh_offset);
1432 IF_DEBUG(linker,belch( "relocations for section %d using symtab %d",
1433 target_shndx, symtab_shndx ));
1434 for (j = 0; j < nent; j++) {
1435 Elf32_Addr offset = rtab[j].r_offset;
1436 Elf32_Word info = rtab[j].r_info;
1438 Elf32_Addr P = ((Elf32_Addr)targ) + offset;
1439 Elf32_Word* pP = (Elf32_Word*)P;
1443 IF_DEBUG(linker,belch( "Rel entry %3d is raw(%6p %6p) ",
1444 j, (void*)offset, (void*)info ));
1446 IF_DEBUG(linker,belch( " ZERO" ));
1449 /* First see if it is a nameless local symbol. */
1450 if (stab[ ELF32_R_SYM(info)].st_name == 0) {
1451 symbol = "(noname)";
1452 S = (Elf32_Addr)(ehdrC
1453 + shdr[stab[ELF32_R_SYM(info)].st_shndx ].sh_offset
1454 + stab[ELF32_R_SYM(info)].st_value
1457 /* No? Should be in the symbol table then. */
1458 symbol = strtab+stab[ ELF32_R_SYM(info)].st_name;
1459 (void *)S = lookupSymbol( symbol );
1462 barf("ocResolve_ELF: %s: unknown symbol `%s'",
1463 oc->fileName, symbol);
1465 IF_DEBUG(linker,belch( "`%s' resolves to %p", symbol, (void*)S ));
1467 IF_DEBUG(linker,fprintf ( stderr, "Reloc: P = %p S = %p A = %p\n", (void*)P, (void*)S, (void*)A ));
1468 switch (ELF32_R_TYPE(info)) {
1469 case R_386_32: *pP = S + A; break;
1470 case R_386_PC32: *pP = S + A - P; break;
1471 default: fprintf(stderr,
1472 "unhandled ELF relocation type %d",
1473 ELF32_R_TYPE(info));
1474 belch("ocResolve_ELF: unhandled ELF relocation type");
1481 if (shdr[i].sh_type == SHT_RELA) {
1482 belch("ocResolve_ELF: RelA style reloc table -- not yet done");
1493 /* -----------------------------------------------------------------------------
1494 * Look up an address to discover whether it is in text or data space.
1496 * Used by the garbage collector when walking the stack.
1497 * -------------------------------------------------------------------------- */
1499 static __inline__ SectionKind
1500 lookupSection ( void* addr )
1505 for ( oc = objects; oc; oc = oc->next ) {
1506 for (i = 0; i < oc->n_sections; i++) {
1507 if (oc->sections[i].start <= addr
1508 && addr <= oc->sections[i].end)
1509 return oc->sections[i].kind;
1512 return SECTIONKIND_OTHER;
1516 is_dynamically_loaded_code_or_rodata_ptr ( void* p )
1518 SectionKind sk = lookupSection(p);
1519 ASSERT (sk != SECTIONKIND_NOINFOAVAIL);
1520 return (sk == SECTIONKIND_CODE_OR_RODATA);
1525 is_dynamically_loaded_rwdata_ptr ( void* p )
1527 SectionKind sk = lookupSection(p);
1528 ASSERT (sk != SECTIONKIND_NOINFOAVAIL);
1529 return (sk == SECTIONKIND_RWDATA);
1534 is_not_dynamically_loaded_ptr ( void* p )
1536 SectionKind sk = lookupSection(p);
1537 ASSERT (sk != SECTIONKIND_NOINFOAVAIL);
1538 return (sk == SECTIONKIND_OTHER);