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