1 /*
2 13 Dec '05
3 Linker no longer used - apart from mymalloc().
4 Instead, simply compile and link switchback.c with test_xxx.c, e.g.:
5 ./> (cd .. && make EXTRA_CFLAGS="-m64" libvex_ppc64_linux.a) && gcc -m64 -Wall -O -g -o switchback switchback.c linker.c ../libvex_ppc64_linux.a test_bzip2.c
6 */
7
8
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <assert.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <unistd.h>
15 #include <elf.h>
16 #include <fcntl.h>
17 #include <string.h>
18 //#include <malloc.h>
19
20 #include "linker.h"
21
22 #include "../pub/libvex_basictypes.h"
23
24 #if 0
25 #define IF_DEBUG(x,y) /* */
26 static int debug_linker = 0;
27 #endif
28
29
30 #if defined(__x86_64__)
31 # define x86_64_TARGET_ARCH
32 #elif defined(__i386__)
33 # define i386_TARGET_ARCH
34 #elif defined (__powerpc__)
35 # define ppc32_TARGET_ARCH
36 #elif defined(__aarch64__)
37 # define arm64_TARGET_ARCH
38 #else
39 # error "Unknown arch"
40 #endif
41
42
43 #if 0
44 #define CALLOC_MAX 10000000
45 static HChar calloc_area[CALLOC_MAX];
46 static UInt calloc_used = 0;
47 static void* calloc_below2G ( Int n, Int m )
48 {
49 void* p;
50 int i;
51 while ((calloc_used % 16) > 0) calloc_used++;
52 assert(calloc_used + n*m < CALLOC_MAX);
53 p = &calloc_area[calloc_used];
54 for (i = 0; i < n*m; i++)
55 calloc_area[calloc_used+i] = 0;
56 calloc_used += n*m;
57 return p;
58 }
59 #endif
60
61 #define MYMALLOC_MAX 50*1000*1000
62 static HChar mymalloc_area[MYMALLOC_MAX];
63 static UInt mymalloc_used = 0;
mymalloc(Int n)64 void* mymalloc ( Int n )
65 {
66 void* p;
67 #if defined(__powerpc64__) || defined(__aarch64__)
68 while ((ULong)(mymalloc_area+mymalloc_used) & 0xFFF)
69 #else
70 while ((UInt)(mymalloc_area+mymalloc_used) & 0xFFF)
71 #endif
72 mymalloc_used++;
73 assert(mymalloc_used+n < MYMALLOC_MAX);
74 p = (void*)(&mymalloc_area[mymalloc_used]);
75 mymalloc_used += n;
76 // printf("mymalloc(%d) = %p\n", n, p);
77 return p;
78 }
79
myfree(void * p)80 void myfree ( void* p )
81 {
82 }
83
84
85
86
87
88
89
90 #if 0
91 ///////////////////////////////////////////////////////////////////
92 ///////////////////////////////////////////////////////////////////
93 ///////////////////////////////////////////////////////////////////
94 //
95 // TYPES
96
97 #define FALSE 0
98 #define TRUE 1
99
100 typedef enum { OBJECT_LOADED, OBJECT_RESOLVED } OStatus;
101
102
103 #define N_FIXUP_PAGES 1
104
105
106 /* Indication of section kinds for loaded objects. Needed by
107 the GC for deciding whether or not a pointer on the stack
108 is a code pointer.
109 */
110 typedef
111 enum { SECTIONKIND_CODE_OR_RODATA,
112 SECTIONKIND_RWDATA,
113 SECTIONKIND_OTHER,
114 SECTIONKIND_NOINFOAVAIL }
115 SectionKind;
116
117 typedef
118 struct _Section {
119 void* start;
120 void* end;
121 SectionKind kind;
122 struct _Section* next;
123 }
124 Section;
125
126 typedef
127 struct _ProddableBlock {
128 void* start;
129 int size;
130 struct _ProddableBlock* next;
131 }
132 ProddableBlock;
133
134 /* Top-level structure for an object module. One of these is allocated
135 * for each object file in use.
136 */
137 typedef struct _ObjectCode {
138 OStatus status;
139 char* fileName;
140 int fileSize;
141 char* formatName; /* eg "ELF32", "DLL", "COFF", etc. */
142
143 /* An array containing ptrs to all the symbol names copied from
144 this object into the global symbol hash table. This is so that
145 we know which parts of the latter mapping to nuke when this
146 object is removed from the system. */
147 char** symbols;
148 int n_symbols;
149
150 /* ptr to malloc'd lump of memory holding the obj file */
151 void* image;
152
153 /* Fixup area for long-distance jumps. */
154 char* fixup;
155 int fixup_used;
156 int fixup_size;
157
158 /* The section-kind entries for this object module. Linked
159 list. */
160 Section* sections;
161
162 /* A private hash table for local symbols. */
163 /* HashTable* */ void* lochash;
164
165 /* Allow a chain of these things */
166 struct _ObjectCode * next;
167
168 /* SANITY CHECK ONLY: a list of the only memory regions which may
169 safely be prodded during relocation. Any attempt to prod
170 outside one of these is an error in the linker. */
171 ProddableBlock* proddables;
172
173 } ObjectCode;
174
175 /*
176 * Define a set of types which can be used for both ELF32 and ELF64
177 */
178
179 #if VEX_HOST_WORDSIZE == 8
180 #define ELFCLASS ELFCLASS64
181 #define Elf_Addr Elf64_Addr
182 #define Elf_Word Elf64_Word
183 #define Elf_Sword Elf64_Sword
184 #define Elf_Ehdr Elf64_Ehdr
185 #define Elf_Phdr Elf64_Phdr
186 #define Elf_Shdr Elf64_Shdr
187 #define Elf_Sym Elf64_Sym
188 #define Elf_Rel Elf64_Rel
189 #define Elf_Rela Elf64_Rela
190 #define ELF_ST_TYPE ELF64_ST_TYPE
191 #define ELF_ST_BIND ELF64_ST_BIND
192 #define ELF_R_TYPE ELF64_R_TYPE
193 #define ELF_R_SYM ELF64_R_SYM
194 #else
195 #define ELFCLASS ELFCLASS32
196 #define Elf_Addr Elf32_Addr
197 #define Elf_Word Elf32_Word
198 #define Elf_Sword Elf32_Sword
199 #define Elf_Ehdr Elf32_Ehdr
200 #define Elf_Phdr Elf32_Phdr
201 #define Elf_Shdr Elf32_Shdr
202 #define Elf_Sym Elf32_Sym
203 #define Elf_Rel Elf32_Rel
204 #define Elf_Rela Elf32_Rela
205 #ifndef ELF_ST_TYPE
206 #define ELF_ST_TYPE ELF32_ST_TYPE
207 #endif
208 #ifndef ELF_ST_BIND
209 #define ELF_ST_BIND ELF32_ST_BIND
210 #endif
211 #ifndef ELF_R_TYPE
212 #define ELF_R_TYPE ELF32_R_TYPE
213 #endif
214 #ifndef ELF_R_SYM
215 #define ELF_R_SYM ELF32_R_SYM
216 #endif
217 #endif
218
219
220
221
222 ///////////////////////////////////////////////////////////////////
223 ///////////////////////////////////////////////////////////////////
224 ///////////////////////////////////////////////////////////////////
225 //
226 // PARANOIA
227
228 /* -----------------------------------------------------------------------
229 * Sanity checking. For each ObjectCode, maintain a list of address ranges
230 * which may be prodded during relocation, and abort if we try and write
231 * outside any of these.
232 */
233 static void addProddableBlock ( ObjectCode* oc, void* start, int size )
234 {
235 ProddableBlock* pb
236 = mymalloc(sizeof(ProddableBlock));
237 if (debug_linker)
238 fprintf(stderr, "aPB oc=%p %p %d (%p .. %p)\n", oc, start, size,
239 start, ((char*)start)+size-1 );
240 assert(size > 0);
241 pb->start = start;
242 pb->size = size;
243 pb->next = oc->proddables;
244 oc->proddables = pb;
245 }
246
247 static void checkProddableBlock ( ObjectCode* oc, void* addr )
248 {
249 ProddableBlock* pb;
250 for (pb = oc->proddables; pb != NULL; pb = pb->next) {
251 char* s = (char*)(pb->start);
252 char* e = s + pb->size - 1;
253 char* a = (char*)addr;
254 /* Assumes that the biggest fixup involves a 4-byte write. This
255 probably needs to be changed to 8 (ie, +7) on 64-bit
256 plats. */
257 if (a >= s && (a+3) <= e) return;
258 }
259 fprintf(stderr,
260 "checkProddableBlock: invalid fixup %p in runtime linker\n",
261 addr);
262 exit(1);
263 }
264
265
266
267 ///////////////////////////////////////////////////////////////////
268 ///////////////////////////////////////////////////////////////////
269 ///////////////////////////////////////////////////////////////////
270 //
271 // String->Addr mappings
272
273 typedef
274 struct { char* mp_name; void* mp_addr; }
275 Maplet;
276
277 typedef
278 struct {
279 int sm_size;
280 int sm_used;
281 Maplet* maplets;
282 }
283 StringMap;
284
285 static StringMap* new_StringMap ( void )
286 {
287 StringMap* sm = mymalloc(sizeof(StringMap));
288 sm->sm_size = 10;
289 sm->sm_used = 0;
290 sm->maplets = mymalloc(10 * sizeof(Maplet));
291 return sm;
292 }
293
294 static void delete_StringMap ( StringMap* sm )
295 {
296 assert(sm->maplets != NULL);
297 myfree(sm->maplets);
298 sm->maplets = NULL;
299 myfree(sm);
300 }
301
302 static void ensure_StringMap ( StringMap* sm )
303 {
304 int i;
305 Maplet* mp2;
306 assert(sm->maplets != NULL);
307 if (sm->sm_used < sm->sm_size)
308 return;
309 sm->sm_size *= 2;
310 mp2 = mymalloc(sm->sm_size * sizeof(Maplet));
311 for (i = 0; i < sm->sm_used; i++)
312 mp2[i] = sm->maplets[i];
313 myfree(sm->maplets);
314 sm->maplets = mp2;
315 }
316
317 static void* search_StringMap ( StringMap* sm, char* name )
318 {
319 int i;
320 for (i = 0; i < sm->sm_used; i++)
321 if (0 == strcmp(name, sm->maplets[i].mp_name))
322 return sm->maplets[i].mp_addr;
323 return NULL;
324 }
325
326 static void addto_StringMap ( StringMap* sm, char* name, void* addr )
327 {
328 ensure_StringMap(sm);
329 sm->maplets[sm->sm_used].mp_name = name;
330 sm->maplets[sm->sm_used].mp_addr = addr;
331 sm->sm_used++;
332 }
333
334 static void paranoid_addto_StringMap ( StringMap* sm, char* name, void* addr )
335 {
336 if (0)
337 fprintf(stderr, "paranoid_addto_StringMap(%s,%p)\n", name, addr);
338 if (search_StringMap(sm,name) != NULL) {
339 fprintf(stderr, "duplicate: paranoid_addto_StringMap(%s,%p)\n", name, addr);
340 exit(1);
341 }
342 addto_StringMap(sm,name,addr);
343 }
344
345
346 ///////////////////////////////////////////////////////////////////
347 ///////////////////////////////////////////////////////////////////
348 ///////////////////////////////////////////////////////////////////
349 //
350 // Top-level linker control.
351
352 StringMap* global_symbol_table = NULL;
353 ObjectCode* global_object_list = NULL;
354
355 static void initLinker ( void )
356 {
357 if (global_symbol_table != NULL)
358 return;
359 global_symbol_table = new_StringMap();
360 }
361
362
363
364 ///////////////////////////////////////////////////////////////////
365 ///////////////////////////////////////////////////////////////////
366 ///////////////////////////////////////////////////////////////////
367 //
368 // SYMBOL TABLE(s)
369
370 /* -----------------------------------------------------------------
371 * lookup a symbol in the global symbol table
372 */
373 static
374 void * lookupSymbol( char *lbl )
375 {
376 void *val;
377 initLinker() ;
378 assert(global_symbol_table != NULL);
379 val = search_StringMap(global_symbol_table, lbl);
380 return val;
381 }
382
383
384 ///////////////////////////////////////////////////////////////////
385 ///////////////////////////////////////////////////////////////////
386 ///////////////////////////////////////////////////////////////////
387 //
388 // HELPERS
389
390 /*
391 * Generic ELF functions
392 */
393
394 static char *
395 findElfSection ( void* objImage, Elf_Word sh_type )
396 {
397 char* ehdrC = (char*)objImage;
398 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
399 Elf_Shdr* shdr = (Elf_Shdr*)(ehdrC + ehdr->e_shoff);
400 char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
401 char* ptr = NULL;
402 int i;
403
404 for (i = 0; i < ehdr->e_shnum; i++) {
405 if (shdr[i].sh_type == sh_type
406 /* Ignore the section header's string table. */
407 && i != ehdr->e_shstrndx
408 /* Ignore string tables named .stabstr, as they contain
409 debugging info. */
410 && 0 != memcmp(".stabstr", sh_strtab + shdr[i].sh_name, 8)
411 ) {
412 ptr = ehdrC + shdr[i].sh_offset;
413 break;
414 }
415 }
416 return ptr;
417 }
418
419 #ifdef arm_TARGET_ARCH
420 static
421 char* alloc_fixup_bytes ( ObjectCode* oc, int nbytes )
422 {
423 char* res;
424 assert(nbytes % 4 == 0);
425 assert(nbytes > 0);
426 res = &(oc->fixup[oc->fixup_used]);
427 oc->fixup_used += nbytes;
428 if (oc->fixup_used >= oc->fixup_size) {
429 fprintf(stderr, "fixup area too small for %s\n", oc->fileName);
430 exit(1);
431 }
432 return res;
433 }
434 #endif
435
436
437 ///////////////////////////////////////////////////////////////////
438 ///////////////////////////////////////////////////////////////////
439 ///////////////////////////////////////////////////////////////////
440 //
441 // RESOLVE
442
443 static
444 void* lookup_magic_hacks ( char* sym )
445 {
446 if (0==strcmp(sym, "printf")) return (void*)(&printf);
447 return NULL;
448 }
449
450 #ifdef arm_TARGET_ARCH
451 static
452 void arm_notify_new_code ( char* start, int length )
453 {
454 __asm __volatile ("mov r1, %0\n\t"
455 "mov r2, %1\n\t"
456 "mov r3, %2\n\t"
457 "swi 0x9f0002\n\t"
458 :
459 : "ir" (start), "ir" (length), "ir" (0) );
460 }
461
462
463 static
464 void gen_armle_goto ( char* fixup, char* dstP )
465 {
466 Elf_Word w = (Elf_Word)dstP;
467 /*
468 2 .text
469 3 0000 04F01FE5 ldr pc, value
470 4 0004 44332211 value: .word 0x11223344
471 */
472 fprintf(stderr,"at %p generating jump to %p\n", fixup, dstP );
473 fixup[0] = 0x04; fixup[1] = 0xF0; fixup[2] = 0x1F; fixup[3] = 0xE5;
474 fixup[4] = w & 0xFF; w >>= 8;
475 fixup[5] = w & 0xFF; w >>= 8;
476 fixup[6] = w & 0xFF; w >>= 8;
477 fixup[7] = w & 0xFF; w >>= 8;
478 arm_notify_new_code(fixup, 8);
479 }
480 #endif /* arm_TARGET_ARCH */
481
482
483 #ifdef ppc32_TARGET_ARCH
484 static void invalidate_icache(void *ptr, int nbytes)
485 {
486 unsigned long startaddr = (unsigned long) ptr;
487 unsigned long endaddr = startaddr + nbytes;
488 unsigned long addr;
489 unsigned long cls = 16; //VG_(cache_line_size);
490
491 startaddr &= ~(cls - 1);
492 for (addr = startaddr; addr < endaddr; addr += cls)
493 asm volatile("dcbst 0,%0" : : "r" (addr));
494 asm volatile("sync");
495 for (addr = startaddr; addr < endaddr; addr += cls)
496 asm volatile("icbi 0,%0" : : "r" (addr));
497 asm volatile("sync; isync");
498 }
499
500 static UInt compute_ppc_HA ( UInt x ) {
501 return 0xFFFF & ( (x >> 16) + ((x & 0x8000) ? 1 : 0) );
502 }
503 static UInt compute_ppc_LO ( UInt x ) {
504 return 0xFFFF & x;
505 }
506 static UInt compute_ppc_HI ( UInt x ) {
507 return 0xFFFF & (x >> 16);
508 }
509 #endif /* ppc32_TARGET_ARCH */
510
511
512 /* Do ELF relocations which lack an explicit addend. All x86-linux
513 relocations appear to be of this form. */
514 static int
515 do_Elf_Rel_relocations ( ObjectCode* oc, char* ehdrC,
516 Elf_Shdr* shdr, int shnum,
517 Elf_Sym* stab, char* strtab )
518 {
519 int j;
520 char *symbol = NULL;
521 Elf_Word* targ;
522 Elf_Rel* rtab = (Elf_Rel*) (ehdrC + shdr[shnum].sh_offset);
523 int nent = shdr[shnum].sh_size / sizeof(Elf_Rel);
524 int target_shndx = shdr[shnum].sh_info;
525 int symtab_shndx = shdr[shnum].sh_link;
526
527 stab = (Elf_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
528 targ = (Elf_Word*)(ehdrC + shdr[ target_shndx ].sh_offset);
529 IF_DEBUG(linker,belch( "relocations for section %d using symtab %d",
530 target_shndx, symtab_shndx ));
531
532 for (j = 0; j < nent; j++) {
533 Elf_Addr offset = rtab[j].r_offset;
534 Elf_Addr info = rtab[j].r_info;
535
536 Elf_Addr P = ((Elf_Addr)targ) + offset;
537 Elf_Word* pP = (Elf_Word*)P;
538 Elf_Addr A = *pP;
539 Elf_Addr S;
540 Elf_Addr value;
541
542 IF_DEBUG(linker,belch( "Rel entry %3d is raw(%6p %6p)",
543 j, (void*)offset, (void*)info ));
544 if (!info) {
545 IF_DEBUG(linker,belch( " ZERO" ));
546 S = 0;
547 } else {
548 Elf_Sym sym = stab[ELF_R_SYM(info)];
549 /* First see if it is a local symbol. */
550 if (ELF_ST_BIND(sym.st_info) == STB_LOCAL) {
551 /* Yes, so we can get the address directly from the ELF symbol
552 table. */
553 symbol = sym.st_name==0 ? "(noname)" : strtab+sym.st_name;
554 S = (Elf_Addr)
555 (ehdrC + shdr[ sym.st_shndx ].sh_offset
556 + stab[ELF_R_SYM(info)].st_value);
557
558 } else {
559 /* No, so look up the name in our global table. */
560 symbol = strtab + sym.st_name;
561 S = (Elf_Addr)lookupSymbol( symbol );
562 }
563 if (!S) {
564 S = (Elf_Addr)lookup_magic_hacks(symbol);
565 }
566 if (!S) {
567 fprintf(stderr,"%s: unknown symbol `%s'\n",
568 oc->fileName, symbol);
569 return 0;
570 }
571 if (debug_linker>1)
572 fprintf(stderr, "\n`%s' resolves to %p\n", symbol, (void*)S );
573 }
574
575 if (debug_linker>1)
576 fprintf(stderr, "Reloc: P = %p S = %p A = %p\n",
577 (void*)P, (void*)S, (void*)A );
578 checkProddableBlock ( oc, pP );
579
580 value = S + A;
581
582 switch (ELF_R_TYPE(info)) {
583 # ifdef i386_TARGET_ARCH
584 case R_386_32: *pP = value; break;
585 case R_386_PC32: *pP = value - P; break;
586 # endif
587 # ifdef arm_TARGET_ARCH
588 case R_ARM_PC24: {
589 Elf_Word w, delta, deltaTop8;
590 /* Generate a jump sequence into the fixup area
591 and branch to that instead. */
592 char* fixup = alloc_fixup_bytes(oc, 8);
593 /* First of all, figure out where we're really trying to
594 jump to. */
595 // compensate for pc+8 bias
596 Elf_Word real_dst = (A & 0x00FFFFFF) + 2;
597 // sign-extend 24-to-32 of real_dst
598 if (real_dst & 0x00800000)
599 real_dst |= 0xFF000000;
600 else
601 real_dst &= 0x00FFFFFF;
602
603 real_dst <<= 2;
604 real_dst += S;
605
606 gen_armle_goto(fixup, (char*)real_dst);
607
608 /* Delta is in bytes .. */
609 delta = (((Elf_Word)fixup) - ((Elf_Word)pP) - 8);
610 deltaTop8 = (delta >> 24) & 0xFF;
611 if (deltaTop8 != 0 && deltaTop8 != 0xFF) {
612 fprintf(stderr,"R_ARM_PC24: out of range delta 0x%x for %s\n",
613 delta, symbol);
614 exit(1);
615 }
616 delta >>= 2;
617 w = *pP;
618 w &= 0xFF000000;
619 w |= (0x00FFFFFF & delta );
620 *pP = w;
621 break;
622 }
623 case R_ARM_ABS32:
624 *pP = value;
625 break;
626 # endif
627 default:
628 fprintf(stderr,
629 "%s: unhandled ELF relocation(Rel) type %d\n\n",
630 oc->fileName, (Int)ELF_R_TYPE(info));
631 return 0;
632 }
633
634 }
635 return 1;
636 }
637
638 /* Do ELF relocations for which explicit addends are supplied.
639 sparc-solaris relocations appear to be of this form. */
640 static int
641 do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC,
642 Elf_Shdr* shdr, int shnum,
643 Elf_Sym* stab, char* strtab )
644 {
645 int j;
646 char *symbol;
647 Elf_Addr targ;
648 Elf_Rela* rtab = (Elf_Rela*) (ehdrC + shdr[shnum].sh_offset);
649 int nent = shdr[shnum].sh_size / sizeof(Elf_Rela);
650 int target_shndx = shdr[shnum].sh_info;
651 int symtab_shndx = shdr[shnum].sh_link;
652
653 stab = (Elf_Sym*) (ehdrC + shdr[ symtab_shndx ].sh_offset);
654 targ = (Elf_Addr) (ehdrC + shdr[ target_shndx ].sh_offset);
655 IF_DEBUG(linker,belch( "relocations for section %d using symtab %d",
656 target_shndx, symtab_shndx ));
657
658 for (j = 0; j < nent; j++) {
659 #if defined(DEBUG) || defined(sparc_TARGET_ARCH) \
660 || defined(ia64_TARGET_ARCH) \
661 || defined(x86_64_TARGET_ARCH) \
662 || defined(ppc32_TARGET_ARCH)
663 /* This #ifdef only serves to avoid unused-var warnings. */
664 Elf_Addr offset = rtab[j].r_offset;
665 Elf_Addr P = targ + offset;
666 #endif
667 Elf_Addr info = rtab[j].r_info;
668 Elf_Addr A = rtab[j].r_addend;
669 Elf_Addr S =0;
670 Elf_Addr value;
671 # if defined(sparc_TARGET_ARCH)
672 Elf_Word* pP = (Elf_Word*)P;
673 Elf_Word w1, w2;
674 # endif
675 # if defined(ia64_TARGET_ARCH)
676 Elf64_Xword *pP = (Elf64_Xword *)P;
677 Elf_Addr addr;
678 # endif
679 # if defined(x86_64_TARGET_ARCH)
680 ULong* pP = (ULong*)P;
681 # endif
682 # if defined(ppc32_TARGET_ARCH)
683 Int sI, sI2;
684 Elf_Word* pP = (Elf_Word*)P;
685 # endif
686
687 IF_DEBUG(linker,belch( "Rel entry %3d is raw(%6p %6p %6p) ",
688 j, (void*)offset, (void*)info,
689 (void*)A ));
690 if (!info) {
691 IF_DEBUG(linker,belch( " ZERO" ));
692 S = 0;
693 } else {
694 Elf_Sym sym = stab[ELF_R_SYM(info)];
695 /* First see if it is a local symbol. */
696 if (ELF_ST_BIND(sym.st_info) == STB_LOCAL) {
697 /* Yes, so we can get the address directly from the ELF symbol
698 table. */
699 symbol = sym.st_name==0 ? "(noname)" : strtab+sym.st_name;
700 S = (Elf_Addr)
701 (ehdrC + shdr[ sym.st_shndx ].sh_offset
702 + stab[ELF_R_SYM(info)].st_value);
703 #ifdef ELF_FUNCTION_DESC
704 /* Make a function descriptor for this function */
705 if (S && ELF_ST_TYPE(sym.st_info) == STT_FUNC) {
706 S = allocateFunctionDesc(S + A);
707 A = 0;
708 }
709 #endif
710 } else {
711 /* No, so look up the name in our global table. */
712 symbol = strtab + sym.st_name;
713 S = (Elf_Addr)lookupSymbol( symbol );
714
715 #ifdef ELF_FUNCTION_DESC
716 /* If a function, already a function descriptor - we would
717 have to copy it to add an offset. */
718 if (S && (ELF_ST_TYPE(sym.st_info) == STT_FUNC) && (A != 0))
719 belch("%s: function %s with addend %p", oc->fileName, symbol, (void *)A);
720 #endif
721 }
722 if (!S) {
723 fprintf(stderr,"%s: unknown symbol `%s'\n", oc->fileName, symbol);
724 return 0;
725 }
726 if (0)
727 fprintf(stderr, "`%s' resolves to %p\n", symbol, (void*)S );
728 }
729
730 #if 0
731 fprintf ( stderr, "Reloc: offset = %p P = %p S = %p A = %p\n",
732 (void*)offset, (void*)P, (void*)S, (void*)A );
733 #endif
734
735 /* checkProddableBlock ( oc, (void*)P ); */
736
737 value = S + A;
738
739 switch (ELF_R_TYPE(info)) {
740 # if defined(sparc_TARGET_ARCH)
741 case R_SPARC_WDISP30:
742 w1 = *pP & 0xC0000000;
743 w2 = (Elf_Word)((value - P) >> 2);
744 ASSERT((w2 & 0xC0000000) == 0);
745 w1 |= w2;
746 *pP = w1;
747 break;
748 case R_SPARC_HI22:
749 w1 = *pP & 0xFFC00000;
750 w2 = (Elf_Word)(value >> 10);
751 ASSERT((w2 & 0xFFC00000) == 0);
752 w1 |= w2;
753 *pP = w1;
754 break;
755 case R_SPARC_LO10:
756 w1 = *pP & ~0x3FF;
757 w2 = (Elf_Word)(value & 0x3FF);
758 ASSERT((w2 & ~0x3FF) == 0);
759 w1 |= w2;
760 *pP = w1;
761 break;
762 /* According to the Sun documentation:
763 R_SPARC_UA32
764 This relocation type resembles R_SPARC_32, except it refers to an
765 unaligned word. That is, the word to be relocated must be treated
766 as four separate bytes with arbitrary alignment, not as a word
767 aligned according to the architecture requirements.
768
769 (JRS: which means that freeloading on the R_SPARC_32 case
770 is probably wrong, but hey ...)
771 */
772 case R_SPARC_UA32:
773 case R_SPARC_32:
774 w2 = (Elf_Word)value;
775 *pP = w2;
776 break;
777 # endif
778 # if defined(ia64_TARGET_ARCH)
779 case R_IA64_DIR64LSB:
780 case R_IA64_FPTR64LSB:
781 *pP = value;
782 break;
783 case R_IA64_PCREL64LSB:
784 *pP = value - P;
785 break;
786 case R_IA64_SEGREL64LSB:
787 addr = findElfSegment(ehdrC, value);
788 *pP = value - addr;
789 break;
790 case R_IA64_GPREL22:
791 ia64_reloc_gprel22(P, value);
792 break;
793 case R_IA64_LTOFF22:
794 case R_IA64_LTOFF22X:
795 case R_IA64_LTOFF_FPTR22:
796 addr = allocateGOTEntry(value);
797 ia64_reloc_gprel22(P, addr);
798 break;
799 case R_IA64_PCREL21B:
800 ia64_reloc_pcrel21(P, S, oc);
801 break;
802 case R_IA64_LDXMOV:
803 /* This goes with R_IA64_LTOFF22X and points to the load to
804 convert into a move. We don't implement relaxation. */
805 break;
806 # endif
807 # if defined(x86_64_TARGET_ARCH)
808 case R_X86_64_64: /* 1 *//* Direct 64 bit */
809 *((ULong*)pP) = (ULong)(S + A);
810 break;
811 case R_X86_64_PC32: /* 2 *//* PC relative 32 bit signed */
812 *((UInt*)pP) = (UInt)(S + A - P);
813 break;
814 case R_X86_64_32: /* 10 *//* Direct 32 bit zero extended */
815 *((UInt*)pP) = (UInt)(S + A);
816 break;
817 case R_X86_64_32S: /* 11 *//* Direct 32 bit sign extended */
818 *((UInt*)pP) = (UInt)(S + A);
819 break;
820 # endif
821 # if defined(ppc32_TARGET_ARCH)
822 case R_PPC_ADDR32: /* 1 *//* 32bit absolute address */
823 *((UInt*)pP) = S+A;
824 invalidate_icache(pP,4);
825 break;
826 case R_PPC_ADDR16_LO: /* 4 *//* lower 16bit of absolute address */
827 *((UInt*)pP) &= 0x0000FFFF;
828 *((UInt*)pP) |= 0xFFFF0000 & (compute_ppc_LO(S+A) << 16);
829 invalidate_icache(pP,4);
830 break;
831 case R_PPC_ADDR16_HA: /* 6 *//* adjusted high 16bit */
832 *((UInt*)pP) &= 0x0000FFFF;
833 *((UInt*)pP) |= 0xFFFF0000 & (compute_ppc_HA(S+A) << 16);
834 invalidate_icache(pP,4);
835 break;
836 case R_PPC_REL24: /* 10 *//* PC relative 26 bit */
837 sI = S+A-P;
838 sI >>= 2;
839 /* the top 9 bits of sI must be the same (all 0s or
840 all 1s) for this to be valid; else we have to fail. */
841 sI2 = sI >> 23; /* 23 == 32 - 9 */
842 if (sI2 != 0 && sI2 != 0xFFFFFFFF) {
843 fprintf(stderr, "%s: R_PPC_REL24 relocation failed\n", oc->fileName );
844 return 0;
845 }
846 *((UInt*)pP) &= ~(0x00FFFFFF << 2);
847 *((UInt*)pP) |= (0xFFFFFF & sI) << 2;
848 invalidate_icache(pP,4);
849 break;
850 case R_PPC_REL32: /* 26 */
851 *((UInt*)pP) = S+A-P;
852 invalidate_icache(pP,4);
853 break;
854 # endif
855 default:
856 fprintf(stderr,
857 "%s: unhandled ELF relocation(RelA) type %d\n",
858 oc->fileName, (Int)ELF_R_TYPE(info));
859 return 0;
860 }
861
862 }
863 return 1;
864 }
865
866
867 static int
868 ocResolve_ELF ( ObjectCode* oc )
869 {
870 char *strtab;
871 int shnum, ok;
872 Elf_Sym* stab = NULL;
873 char* ehdrC = (char*)(oc->image);
874 Elf_Ehdr* ehdr = (Elf_Ehdr*) ehdrC;
875 Elf_Shdr* shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
876 char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
877
878 /* first find "the" symbol table */
879 stab = (Elf_Sym*) findElfSection ( ehdrC, SHT_SYMTAB );
880
881 /* also go find the string table */
882 strtab = findElfSection ( ehdrC, SHT_STRTAB );
883
884 if (stab == NULL || strtab == NULL) {
885 fprintf(stderr,"%s: can't find string or symbol table\n", oc->fileName);
886 return 0;
887 }
888
889 /* Process the relocation sections. */
890 for (shnum = 0; shnum < ehdr->e_shnum; shnum++) {
891
892 /* Skip sections called ".rel.stab". These appear to contain
893 relocation entries that, when done, make the stabs debugging
894 info point at the right places. We ain't interested in all
895 dat jazz, mun. */
896 if (0 == memcmp(".rel.stab", sh_strtab + shdr[shnum].sh_name, 9))
897 continue;
898
899 if (shdr[shnum].sh_type == SHT_REL ) {
900 ok = do_Elf_Rel_relocations ( oc, ehdrC, shdr,
901 shnum, stab, strtab );
902 if (!ok) return ok;
903 }
904 else
905 if (shdr[shnum].sh_type == SHT_RELA) {
906 ok = do_Elf_Rela_relocations ( oc, ehdrC, shdr,
907 shnum, stab, strtab );
908 if (!ok) return ok;
909 }
910 }
911
912 /* Free the local symbol table; we won't need it again. */
913 delete_StringMap(oc->lochash);
914 oc->lochash = NULL;
915
916 return 1;
917 }
918
919
920 ///////////////////////////////////////////////////////////////////
921 ///////////////////////////////////////////////////////////////////
922 ///////////////////////////////////////////////////////////////////
923 //
924 // VERIFY
925
926 static int
927 ocVerifyImage_ELF ( ObjectCode* oc )
928 {
929 Elf_Shdr* shdr;
930 Elf_Sym* stab;
931 int i, j, nent, nstrtab, nsymtabs;
932 char* sh_strtab;
933 char* strtab;
934
935 char* ehdrC = (char*)(oc->image);
936 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
937
938 if (ehdr->e_ident[EI_MAG0] != ELFMAG0 ||
939 ehdr->e_ident[EI_MAG1] != ELFMAG1 ||
940 ehdr->e_ident[EI_MAG2] != ELFMAG2 ||
941 ehdr->e_ident[EI_MAG3] != ELFMAG3) {
942 fprintf(stderr,"%s: not an ELF object\n", oc->fileName);
943 return 0;
944 }
945
946 if (ehdr->e_ident[EI_CLASS] != ELFCLASS) {
947 fprintf(stderr,"%s: unsupported ELF format\n", oc->fileName);
948 return 0;
949 }
950
951 if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
952 if (debug_linker)
953 fprintf(stderr, "Is little-endian\n" );
954 } else
955 if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
956 if (debug_linker)
957 fprintf(stderr, "Is big-endian\n" );
958 } else {
959 fprintf(stderr,"%s: unknown endiannness\n", oc->fileName);
960 return 0;
961 }
962
963 if (ehdr->e_type != ET_REL) {
964 fprintf(stderr,"%s: not a relocatable object (.o) file\n", oc->fileName);
965 return 0;
966 }
967 if (debug_linker)
968 fprintf(stderr, "Is a relocatable object (.o) file\n" );
969
970 if (debug_linker)
971 fprintf(stderr, "Architecture is " );
972 switch (ehdr->e_machine) {
973 case EM_386: if (debug_linker) fprintf(stderr, "x86\n" ); break;
974 case EM_SPARC: if (debug_linker) fprintf(stderr, "sparc\n" ); break;
975 case EM_ARM: if (debug_linker) fprintf(stderr, "arm\n" ); break;
976 #ifdef EM_IA_64
977 case EM_IA_64: if (debug_linker) fprintf(stderr, "ia64\n" ); break;
978 #endif
979 case EM_X86_64: if (debug_linker) fprintf(stderr, "x86_64\n" ); break;
980 case EM_PPC: if (debug_linker) fprintf(stderr, "ppc\n" ); break;
981 default: if (debug_linker) fprintf(stderr, "unknown\n" );
982 fprintf(stderr,"%s: unknown architecture\n", oc->fileName);
983 return 0;
984 }
985
986 if (debug_linker>1) fprintf(stderr,
987 "\nSection header table: start %lld, n_entries %d, ent_size %d\n",
988 (Long)ehdr->e_shoff,
989 ehdr->e_shnum, ehdr->e_shentsize );
990
991 assert (ehdr->e_shentsize == sizeof(Elf_Shdr));
992
993 shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
994
995 if (ehdr->e_shstrndx == SHN_UNDEF) {
996 fprintf(stderr,"%s: no section header string table\n", oc->fileName);
997 return 0;
998 } else {
999 if (debug_linker>1)
1000 fprintf(stderr, "Section header string table is section %d\n",
1001 ehdr->e_shstrndx);
1002 sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
1003 }
1004
1005 for (i = 0; i < ehdr->e_shnum; i++) {
1006 if (debug_linker>1) fprintf(stderr, "%2d: ", i );
1007 if (debug_linker>1) fprintf(stderr, "type=%2d ", (int)shdr[i].sh_type );
1008 if (debug_linker>1) fprintf(stderr, "size=%4d ", (int)shdr[i].sh_size );
1009 if (debug_linker>1) fprintf(stderr, "offs=%4d ", (int)shdr[i].sh_offset );
1010 if (debug_linker>1) fprintf(stderr, " (%p .. %p) ",
1011 ehdrC + shdr[i].sh_offset,
1012 ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1);
1013
1014 if (shdr[i].sh_type == SHT_REL) {
1015 if (debug_linker>1) fprintf(stderr, "Rel " );
1016 } else if (shdr[i].sh_type == SHT_RELA) {
1017 if (debug_linker>1) fprintf(stderr, "RelA " );
1018 } else {
1019 if (debug_linker>1) fprintf(stderr," ");
1020 }
1021 if (sh_strtab) {
1022 if (debug_linker>1) fprintf(stderr, "sname=%s\n",
1023 sh_strtab + shdr[i].sh_name );
1024 }
1025 }
1026
1027 if (debug_linker>1) fprintf(stderr, "\nString tables\n" );
1028 strtab = NULL;
1029 nstrtab = 0;
1030 for (i = 0; i < ehdr->e_shnum; i++) {
1031 if (shdr[i].sh_type == SHT_STRTAB
1032 /* Ignore the section header's string table. */
1033 && i != ehdr->e_shstrndx
1034 /* Ignore string tables named .stabstr, as they contain
1035 debugging info. */
1036 && 0 != memcmp(".stabstr", sh_strtab + shdr[i].sh_name, 8)
1037 ) {
1038 if (debug_linker>1)
1039 fprintf(stderr," section %d is a normal string table\n", i );
1040 strtab = ehdrC + shdr[i].sh_offset;
1041 nstrtab++;
1042 }
1043 }
1044 if (nstrtab != 1) {
1045 fprintf(stderr,"%s: no string tables, or too many\n", oc->fileName);
1046 return 0;
1047 }
1048
1049 nsymtabs = 0;
1050 if (debug_linker>1) fprintf(stderr, "\nSymbol tables\n" );
1051 for (i = 0; i < ehdr->e_shnum; i++) {
1052 if (shdr[i].sh_type != SHT_SYMTAB) continue;
1053 if (debug_linker>1) fprintf(stderr, "section %d is a symbol table\n", i );
1054 nsymtabs++;
1055 stab = (Elf_Sym*) (ehdrC + shdr[i].sh_offset);
1056 nent = shdr[i].sh_size / sizeof(Elf_Sym);
1057 if (debug_linker>1) fprintf(stderr,
1058 " number of entries is apparently %d (%lld rem)\n",
1059 nent,
1060 (Long)(shdr[i].sh_size % sizeof(Elf_Sym))
1061 );
1062 if (0 != shdr[i].sh_size % sizeof(Elf_Sym)) {
1063 fprintf(stderr,"%s: non-integral number of symbol table entries\n",
1064 oc->fileName);
1065 return 0;
1066 }
1067 for (j = 0; j < nent; j++) {
1068 if (debug_linker>1) fprintf(stderr, " %2d ", j );
1069 if (debug_linker>1) fprintf(stderr, " sec=%-5d size=%-3d val=%5p ",
1070 (int)stab[j].st_shndx,
1071 (int)stab[j].st_size,
1072 (char*)stab[j].st_value );
1073
1074 if (debug_linker>1) fprintf(stderr, "type=" );
1075 switch (ELF_ST_TYPE(stab[j].st_info)) {
1076 case STT_NOTYPE: if (debug_linker>1) fprintf(stderr, "notype " ); break;
1077 case STT_OBJECT: if (debug_linker>1) fprintf(stderr, "object " ); break;
1078 case STT_FUNC : if (debug_linker>1) fprintf(stderr, "func " ); break;
1079 case STT_SECTION: if (debug_linker>1) fprintf(stderr, "section" ); break;
1080 case STT_FILE: if (debug_linker>1) fprintf(stderr, "file " ); break;
1081 default: if (debug_linker>1) fprintf(stderr, "? " ); break;
1082 }
1083 if (debug_linker>1) fprintf(stderr, " " );
1084
1085 if (debug_linker>1) fprintf(stderr, "bind=" );
1086 switch (ELF_ST_BIND(stab[j].st_info)) {
1087 case STB_LOCAL : if (debug_linker>1) fprintf(stderr, "local " ); break;
1088 case STB_GLOBAL: if (debug_linker>1) fprintf(stderr, "global" ); break;
1089 case STB_WEAK : if (debug_linker>1) fprintf(stderr, "weak " ); break;
1090 default: if (debug_linker>1) fprintf(stderr, "? " ); break;
1091 }
1092 if (debug_linker>1) fprintf(stderr, " " );
1093
1094 if (debug_linker>1) fprintf(stderr, "name=%s\n", strtab + stab[j].st_name );
1095 }
1096 }
1097
1098 if (nsymtabs == 0) {
1099 fprintf(stderr,"%s: didn't find any symbol tables\n", oc->fileName);
1100 return 0;
1101 }
1102
1103 return 1;
1104 }
1105
1106
1107 ///////////////////////////////////////////////////////////////////
1108 ///////////////////////////////////////////////////////////////////
1109 ///////////////////////////////////////////////////////////////////
1110 //
1111 // GETNAMES
1112
1113 static int
1114 ocGetNames_ELF ( ObjectCode* oc )
1115 {
1116 int i, j, k, nent;
1117 Elf_Sym* stab;
1118
1119 char* ehdrC = (char*)(oc->image);
1120 Elf_Ehdr* ehdr = (Elf_Ehdr*)ehdrC;
1121 char* strtab = findElfSection ( ehdrC, SHT_STRTAB );
1122 Elf_Shdr* shdr = (Elf_Shdr*) (ehdrC + ehdr->e_shoff);
1123
1124 char* sh_strtab = ehdrC + shdr[ehdr->e_shstrndx].sh_offset;
1125 char* sec_name;
1126
1127 assert(global_symbol_table != NULL);
1128
1129 if (!strtab) {
1130 fprintf(stderr,"%s: no strtab\n", oc->fileName);
1131 return 0;
1132 }
1133
1134 k = 0;
1135 for (i = 0; i < ehdr->e_shnum; i++) {
1136 /* Figure out what kind of section it is. Logic derived from
1137 Figure 1.14 ("Special Sections") of the ELF document
1138 ("Portable Formats Specification, Version 1.1"). */
1139 Elf_Shdr hdr = shdr[i];
1140 SectionKind kind = SECTIONKIND_OTHER;
1141 int is_bss = FALSE;
1142
1143 if (hdr.sh_type == SHT_PROGBITS
1144 && (hdr.sh_flags & SHF_ALLOC) && (hdr.sh_flags & SHF_EXECINSTR)) {
1145 /* .text-style section */
1146 kind = SECTIONKIND_CODE_OR_RODATA;
1147 }
1148 else
1149 if (hdr.sh_type == SHT_PROGBITS
1150 && (hdr.sh_flags & SHF_ALLOC) && (hdr.sh_flags & SHF_WRITE)) {
1151 /* .data-style section */
1152 kind = SECTIONKIND_RWDATA;
1153 }
1154 else
1155 if (hdr.sh_type == SHT_PROGBITS
1156 && (hdr.sh_flags & SHF_ALLOC) && !(hdr.sh_flags & SHF_WRITE)) {
1157 /* .rodata-style section */
1158 kind = SECTIONKIND_CODE_OR_RODATA;
1159 }
1160 else
1161 if (hdr.sh_type == SHT_NOBITS
1162 && (hdr.sh_flags & SHF_ALLOC) && (hdr.sh_flags & SHF_WRITE)) {
1163 /* .bss-style section */
1164 kind = SECTIONKIND_RWDATA;
1165 is_bss = TRUE;
1166 }
1167
1168 if (is_bss && shdr[i].sh_size > 0) {
1169 /* This is a non-empty .bss section. Allocate zeroed space for
1170 it, and set its .sh_offset field such that
1171 ehdrC + .sh_offset == addr_of_zeroed_space. */
1172 char* zspace = calloc(1, shdr[i].sh_size);
1173 shdr[i].sh_offset = ((char*)zspace) - ((char*)ehdrC);
1174 if (1)
1175 fprintf(stderr, "BSS section at %p, size %lld\n",
1176 zspace, (Long)shdr[i].sh_size);
1177 }
1178
1179 /* When loading objects compiled with -g, it seems there are
1180 relocations in various debug-info sections. So we'd better
1181 tell addProddableBlock to allow those bits to be prodded. */
1182 //fprintf(stderr, "ZZZZZZZZZZ %s\n", sh_strtab + hdr.sh_name);
1183 sec_name = sh_strtab + shdr[i].sh_name;
1184 if (kind == SECTIONKIND_OTHER
1185 && (0 == strcmp(".debug_info", sec_name)
1186 || 0 == strcmp(".debug_line", sec_name)
1187 || 0 == strcmp(".debug_pubnames", sec_name)
1188 || 0 == strcmp(".debug_aranges", sec_name)
1189 || 0 == strcmp(".debug_frame", sec_name))) {
1190 kind = SECTIONKIND_CODE_OR_RODATA;
1191 }
1192
1193 /* fill in the section info */
1194 if (kind != SECTIONKIND_OTHER && shdr[i].sh_size > 0) {
1195 addProddableBlock(oc, ehdrC + shdr[i].sh_offset, shdr[i].sh_size);
1196 //addSection(oc, kind, ehdrC + shdr[i].sh_offset,
1197 // ehdrC + shdr[i].sh_offset + shdr[i].sh_size - 1);
1198 }
1199
1200 if (shdr[i].sh_type != SHT_SYMTAB) continue;
1201
1202 /* copy stuff into this module's object symbol table */
1203 stab = (Elf_Sym*) (ehdrC + shdr[i].sh_offset);
1204 nent = shdr[i].sh_size / sizeof(Elf_Sym);
1205
1206 oc->n_symbols = nent;
1207 oc->symbols = mymalloc(oc->n_symbols * sizeof(char*));
1208
1209 for (j = 0; j < nent; j++) {
1210
1211 char isLocal = FALSE; /* avoids uninit-var warning */
1212 char* ad = NULL;
1213 char* nm = strtab + stab[j].st_name;
1214 int secno = stab[j].st_shndx;
1215
1216 /* Figure out if we want to add it; if so, set ad to its
1217 address. Otherwise leave ad == NULL. */
1218
1219 if (secno == SHN_COMMON) {
1220 isLocal = FALSE;
1221 # if defined(__x86_64__)
1222 ad = calloc_below2G(1, stab[j].st_size);
1223 # else
1224 ad = calloc(1, stab[j].st_size);
1225 # endif
1226 // assert( (Addr)ad < 0xF0000000ULL );
1227
1228 if (0)
1229 fprintf(stderr, "COMMON symbol, size %lld name %s allocd %p\n",
1230 (Long)stab[j].st_size, nm, ad);
1231 /* Pointless to do addProddableBlock() for this area,
1232 since the linker should never poke around in it. */
1233 }
1234 else
1235 if ( ( ELF_ST_BIND(stab[j].st_info)==STB_GLOBAL
1236 || ELF_ST_BIND(stab[j].st_info)==STB_LOCAL
1237 )
1238 /* and not an undefined symbol */
1239 && stab[j].st_shndx != SHN_UNDEF
1240 /* and not in a "special section" */
1241 && stab[j].st_shndx < SHN_LORESERVE
1242 &&
1243 /* and it's a not a section or string table or anything silly */
1244 ( ELF_ST_TYPE(stab[j].st_info)==STT_FUNC ||
1245 ELF_ST_TYPE(stab[j].st_info)==STT_OBJECT ||
1246 ELF_ST_TYPE(stab[j].st_info)==STT_NOTYPE
1247 )
1248 ) {
1249 /* Section 0 is the undefined section, hence > and not >=. */
1250 assert(secno > 0 && secno < ehdr->e_shnum);
1251 /*
1252 if (shdr[secno].sh_type == SHT_NOBITS) {
1253 fprintf(stderr, " BSS symbol, size %d off %d name %s\n",
1254 stab[j].st_size, stab[j].st_value, nm);
1255 }
1256 */
1257 ad = ehdrC + shdr[ secno ].sh_offset + stab[j].st_value;
1258 if (ELF_ST_BIND(stab[j].st_info)==STB_LOCAL) {
1259 isLocal = TRUE;
1260 } else {
1261 #ifdef ELF_FUNCTION_DESC
1262 /* dlsym() and the initialisation table both give us function
1263 * descriptors, so to be consistent we store function descriptors
1264 * in the symbol table */
1265 if (ELF_ST_TYPE(stab[j].st_info) == STT_FUNC)
1266 ad = (char *)allocateFunctionDesc((Elf_Addr)ad);
1267 #endif
1268 if (0|| debug_linker)
1269 fprintf(stderr, "addOTabName(GLOB): %10p %s %s\n",
1270 ad, oc->fileName, nm );
1271 isLocal = FALSE;
1272 }
1273 }
1274
1275 /* And the decision is ... */
1276
1277 if (ad != NULL) {
1278 assert(nm != NULL);
1279 oc->symbols[j] = nm;
1280 /* Acquire! */
1281 if (isLocal) {
1282 /* Ignore entirely. */
1283 } else {
1284 //ghciInsertStrHashTable(oc->fileName, global_symbol_table, nm, ad);
1285 paranoid_addto_StringMap(global_symbol_table, nm, ad);
1286 }
1287 } else {
1288 /* Skip. */
1289 if (debug_linker>1) fprintf(stderr, "skipping `%s'\n",
1290 strtab + stab[j].st_name );
1291 /*
1292 fprintf(stderr,
1293 "skipping bind = %d, type = %d, shndx = %d `%s'\n",
1294 (int)ELF_ST_BIND(stab[j].st_info),
1295 (int)ELF_ST_TYPE(stab[j].st_info),
1296 (int)stab[j].st_shndx,
1297 strtab + stab[j].st_name
1298 );
1299 */
1300 oc->symbols[j] = NULL;
1301 }
1302
1303 }
1304 }
1305
1306 return 1;
1307 }
1308
1309
1310 ///////////////////////////////////////////////////////////////////
1311 ///////////////////////////////////////////////////////////////////
1312 ///////////////////////////////////////////////////////////////////
1313 //
1314 // TOP-LEVEL CONTROL OF THE LINKER
1315
1316
1317 /* ---------------------------------------------------------------------
1318 * Load an obj (populate the global symbol table, but don't resolve yet)
1319 *
1320 * Returns: 1 if ok, 0 on error.
1321 */
1322 static
1323 int loadObj( char *path )
1324 {
1325 ObjectCode* oc;
1326 struct stat st;
1327 int r;
1328 int fd, pagesize;
1329 char* p;
1330
1331 initLinker();
1332
1333 fprintf(stderr, "==== loadObj %s ====\n", path );
1334
1335 /* Check that we haven't already loaded this object. */
1336 {
1337 ObjectCode *o;
1338 int is_dup = 0;
1339 for (o = global_object_list; o; o = o->next) {
1340 if (0 == strcmp(o->fileName, path))
1341 is_dup = 1;
1342 }
1343 if (is_dup) {
1344 fprintf(stderr,
1345 "\n\n"
1346 "GHCi runtime linker: warning: looks like you're trying to load the\n"
1347 "same object file twice:\n"
1348 " %s\n"
1349 , path);
1350 exit(1);
1351 }
1352 }
1353
1354 oc = mymalloc(sizeof(ObjectCode));
1355
1356 oc->formatName = "ELF";
1357
1358 r = stat(path, &st);
1359 if (r == -1) { return 0; }
1360
1361 /* sigh, strdup() isn't a POSIX function, so do it the long way */
1362 oc->fileName = mymalloc( strlen(path)+1 );
1363 strcpy(oc->fileName, path);
1364
1365 oc->fileSize = st.st_size;
1366 oc->symbols = NULL;
1367 oc->sections = NULL;
1368 oc->lochash = new_StringMap();
1369 oc->proddables = NULL;
1370 oc->fixup = NULL;
1371 oc->fixup_used = 0;
1372 oc->fixup_size = 0;
1373
1374 /* chain it onto the list of objects */
1375 oc->next = global_object_list;
1376 global_object_list = oc;
1377
1378 fd = open(path, O_RDONLY);
1379 if (fd == -1) {
1380 fprintf(stderr,"loadObj: can't open `%s'\n", path);
1381 exit(1);
1382 }
1383
1384 /* Allocate a 1-page area just prior to the image, so we can put
1385 fixup code fragments there. Used for doing R_ARM_PC24
1386 relocations for jump distances > 64M. */
1387
1388 pagesize = getpagesize();
1389 // p = memalign(pagesize, N_FIXUP_PAGES * pagesize
1390 // + oc->fileSize);
1391 p = mymalloc(N_FIXUP_PAGES * pagesize + oc->fileSize);
1392 if (0) fprintf(stderr,"XXXX p = %p\n", p);
1393 if (p == NULL) {
1394 fprintf(stderr,"loadObj: failed to allocate space for `%s'\n", path);
1395 exit(1);
1396 }
1397
1398 oc->fixup = p;
1399 oc->fixup_size = N_FIXUP_PAGES * pagesize;
1400 oc->fixup_used = 0;
1401 oc->image = &(p[ oc->fixup_size ]);
1402
1403 r = read(fd, oc->image, oc->fileSize);
1404 if (r != oc->fileSize) {
1405 fprintf(stderr,"loadObj: failed to read `%s'\n", path);
1406 exit(1);
1407 }
1408
1409 fprintf(stderr, "loaded %s at %p (fixup = %p)\n",
1410 oc->fileName, oc->image, oc->fixup );
1411
1412 close(fd);
1413
1414 /* verify the in-memory image */
1415 r = ocVerifyImage_ELF ( oc );
1416 if (!r) { return r; }
1417
1418 /* build the symbol list for this image */
1419 r = ocGetNames_ELF ( oc );
1420 if (!r) { return r; }
1421
1422 /* loaded, but not resolved yet */
1423 oc->status = OBJECT_LOADED;
1424
1425 #ifdef ppc32_TARGET_ARCH
1426 invalidate_icache(oc->image, oc->fileSize);
1427 #endif
1428
1429 return 1;
1430 }
1431
1432
1433
1434 /* ---------------------------------------------------------------------------
1435 * resolve all the currently unlinked objects in memory
1436 *
1437 * Returns: 1 if ok, 0 on error.
1438 */
1439 static
1440 int resolveObjs( void )
1441 {
1442 ObjectCode *oc;
1443 int r;
1444
1445 initLinker();
1446
1447 for (oc = global_object_list; oc; oc = oc->next) {
1448 if (oc->status != OBJECT_RESOLVED) {
1449 r = ocResolve_ELF ( oc );
1450 if (!r) { return r; }
1451 oc->status = OBJECT_RESOLVED;
1452 }
1453 }
1454 return 1;
1455 }
1456
1457
1458 /* ---------------------------------------------------------------------------
1459 * Top-level linker.
1460 */
1461
1462 /* Load and link a bunch of .o's, and return the address of
1463 'entry'. Or NULL if something borks.
1464 */
1465 void* linker_top_level_LINK ( int n_object_names, char** object_names )
1466 {
1467 int r, i;
1468 void* mainp;
1469
1470 initLinker();
1471 for (i = 0; i < n_object_names; i++) {
1472 //fprintf(stderr, "linkloop %d %s\n", i, object_names[i] );
1473 r = loadObj( object_names[i] );
1474 if (r != 1) return NULL;
1475 }
1476 r = resolveObjs();
1477 if (r != 1) return NULL;
1478 mainp = search_StringMap ( global_symbol_table, "entry" );
1479 if (mainp == NULL) return NULL;
1480 printf("switchback: Linker: success!\n");
1481 return mainp;
1482 }
1483
1484
1485 #endif
1486