plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

symelf.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 }