URI:
       tsymelf.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tsymelf.c (2186B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <mach.h>
            4 #include "elf.h"
            5 
            6 static int
            7 elfsyminit(Fhdr *fp)
            8 {
            9         int i, onlyundef;
           10         Elf *elf;
           11         Symbol sym;
           12         ElfSym esym;
           13         ElfProg *p;
           14 
           15         elf = fp->elf;
           16 
           17         onlyundef = fp->nsym > 0;
           18         for(i=0; elfsym(elf, i, &esym) >= 0; i++){
           19                 if(esym.name == nil)
           20                         continue;
           21                 if(onlyundef && esym.shndx != ElfSymShnNone)
           22                         continue;
           23                 if(esym.type != ElfSymTypeObject && esym.type != ElfSymTypeFunc)
           24                         continue;
           25                 if(strchr(esym.name, '@'))
           26                         continue;
           27                 memset(&sym, 0, sizeof sym);
           28                 sym.name = esym.name;
           29                 sym.loc.type = LADDR;
           30                 sym.loc.addr = esym.value;
           31                 if(esym.size){
           32                         sym.hiloc.type = LADDR;
           33                         sym.hiloc.addr = esym.value+esym.size;
           34                 }
           35                 sym.fhdr = fp;
           36                 if(esym.type==ElfSymTypeObject){
           37                         sym.class = CDATA;
           38                         sym.type = 'D';
           39                         if(&elf->sect[esym.shndx] == elf->bss)
           40                                 sym.type = 'B';
           41                 }else if(esym.type==ElfSymTypeFunc){
           42                         sym.class = CTEXT;
           43                         sym.type = 'T';
           44                 }
           45                 if(esym.shndx == ElfSymShnNone)
           46                         sym.type = 'U';
           47                 if(esym.bind==ElfSymBindLocal)
           48                         sym.type += 'a' - 'A';
           49                 _addsym(fp, &sym);
           50         }
           51 
           52         for(i=0; i<elf->nprog; i++){
           53                 p = &elf->prog[i];
           54                 if(p->type != ElfProgDynamic)
           55                         continue;
           56                 elf->dynamic = p->vaddr;
           57                 memset(&sym, 0, sizeof sym);
           58                 sym.name = "_DYNAMIC";
           59                 sym.loc = locaddr(p->vaddr);
           60                 sym.hiloc = locaddr(p->vaddr+p->filesz);
           61                 sym.type = 'D';
           62                 sym.class = CDATA;
           63                 _addsym(fp, &sym);
           64         }
           65         return 0;
           66 }
           67 
           68 int
           69 elfsymlookup(Elf *elf, char *name, ulong *addr)
           70 {
           71         int i;
           72         ElfSym esym;
           73 
           74         for(i=0; elfsym(elf, i, &esym) >= 0; i++){
           75                 if(esym.name == nil)
           76                         continue;
           77                 if(strcmp(esym.name, name) == 0){
           78                         *addr = esym.value;
           79                         return 0;
           80                 }
           81         }
           82         return -1;
           83 }
           84 
           85 int
           86 symelf(Fhdr *fhdr)
           87 {
           88         int ret;
           89 
           90         ret = -1;
           91 
           92         /* try dwarf */
           93         if(fhdr->dwarf){
           94                 if(machdebug)
           95                         fprint(2, "dwarf symbols...\n");
           96                 if(symdwarf(fhdr) < 0)
           97                         fprint(2, "initializing dwarf: %r");
           98                 else
           99                         ret = 0;
          100         }
          101 
          102         /* try stabs */
          103         if(fhdr->stabs.stabbase){
          104                 if(machdebug)
          105                         fprint(2, "stabs symbols...\n");
          106                 if(symstabs(fhdr) < 0)
          107                         fprint(2, "initializing stabs: %r");
          108                 else
          109                         ret = 0;
          110         }
          111 
          112         if(machdebug)
          113                 fprint(2, "elf symbols...\n");
          114 
          115         if(elfsyminit(fhdr) < 0)
          116                 fprint(2, "initializing elf: %r");
          117         else
          118                 ret = 0;
          119         return ret;
          120 }