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; 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 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( Ptr_to_ULong(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