Пример #1
0
// Walk over symtab, calling fn(&s) for each symbol.
static void
walksymtab(void (*fn)(Sym*))
{
	byte *p, *ep, *q;
	Sym s;
	int32 bigend;

	p = symtab;
	ep = esymtab;

	// Default is big-endian value encoding.
	// If table begins fe ff ff ff 00 00, little-endian.
	bigend = 1;
	if(symtab[0] == 0xfe && symtab[1] == 0xff && symtab[2] == 0xff && symtab[3] == 0xff && symtab[4] == 0x00 && symtab[5] == 0x00) {
		p += 6;
		bigend = 0;
	}
	while(p < ep) {
		if(p + 7 > ep)
			break;

		if(bigend)
			s.value = ((uint32)p[0]<<24) | ((uint32)p[1]<<16) | ((uint32)p[2]<<8) | ((uint32)p[3]);
		else
			s.value = ((uint32)p[3]<<24) | ((uint32)p[2]<<16) | ((uint32)p[1]<<8) | ((uint32)p[0]);

		if(!(p[4]&0x80))
			break;
		s.symtype = p[4] & ~0x80;
		p += 5;
		s.name = p;
		if(s.symtype == 'z' || s.symtype == 'Z') {
			// path reference string - skip first byte,
			// then 2-byte pairs ending at two zeros.
			q = p+1;
			for(;;) {
				if(q+2 > ep)
					return;
				if(q[0] == '\0' && q[1] == '\0')
					break;
				q += 2;
			}
			p = q+2;
		}else{
			q = runtime·mchr(p, '\0', ep);
			if(q == nil)
				break;
			p = q+1;
		}
		p += 4;	// go type
		fn(&s);
	}
}
Пример #2
0
// Walk over symtab, calling fn(&s) for each symbol.
static void
walksymtab(void (*fn)(Sym*))
{
    int32 *v;
    byte *p, *ep, *q;
    Sym s;

    // TODO(rsc): Remove once TODO at top of file is done.
    if(goos != nil && strcmp((uint8*)goos, (uint8*)"nacl") == 0)
        return;
    if(goos != nil && strcmp((uint8*)goos, (uint8*)"pchw") == 0)
        return;

#ifdef __MINGW__
    v = get_symdat_addr();
    p = (byte*)v+8;
#else
    v = SYMCOUNTS;
    p = SYMDATA;
#endif
    ep = p + v[0];
    while(p < ep) {
        if(p + 7 > ep)
            break;
        s.value = ((uint32)p[0]<<24) | ((uint32)p[1]<<16) | ((uint32)p[2]<<8) | ((uint32)p[3]);
        if(!(p[4]&0x80))
            break;
        s.symtype = p[4] & ~0x80;
        p += 5;
        s.name = p;
        if(s.symtype == 'z' || s.symtype == 'Z') {
            // path reference string - skip first byte,
            // then 2-byte pairs ending at two zeros.
            q = p+1;
            for(;;) {
                if(q+2 > ep)
                    return;
                if(q[0] == '\0' && q[1] == '\0')
                    break;
                q += 2;
            }
            p = q+2;
        } else {
            q = mchr(p, '\0', ep);
            if(q == nil)
                break;
            p = q+1;
        }
        p += 4;	// go type
        fn(&s);
    }
}
Пример #3
0
// Walk over symtab, calling fn(&s) for each symbol.
static void
walksymtab(void (*fn)(Sym*))
{
	int32 *v;
	byte *p, *ep, *q;
	Sym s;

	if(symdat == nil)
		return;

#ifdef __WINDOWS__
	v = get_symdat_addr();
	p = (byte*)v+8;
#else
	v = symdat;
	p = (byte*)(symdat+2);
#endif
	ep = p + v[0];
	while(p < ep) {
		if(p + 7 > ep)
			break;
		s.value = ((uint32)p[0]<<24) | ((uint32)p[1]<<16) | ((uint32)p[2]<<8) | ((uint32)p[3]);
		if(!(p[4]&0x80))
			break;
		s.symtype = p[4] & ~0x80;
		p += 5;
		s.name = p;
		if(s.symtype == 'z' || s.symtype == 'Z') {
			// path reference string - skip first byte,
			// then 2-byte pairs ending at two zeros.
			q = p+1;
			for(;;) {
				if(q+2 > ep)
					return;
				if(q[0] == '\0' && q[1] == '\0')
					break;
				q += 2;
			}
			p = q+2;
		}else{
			q = mchr(p, '\0', ep);
			if(q == nil)
				break;
			p = q+1;
		}
		p += 4;	// go type
		fn(&s);
	}
}
Пример #4
0
// Walk over symtab, calling fn(&s) for each symbol.
static void
walksymtab(void (*fn)(Sym*))
{
	byte *p, *ep, *q;
	Sym s;

	p = symtab;
	ep = esymtab;
	while(p < ep) {
		if(p + 7 > ep)
			break;
		s.value = ((uint32)p[0]<<24) | ((uint32)p[1]<<16) | ((uint32)p[2]<<8) | ((uint32)p[3]);

		if(!(p[4]&0x80))
			break;
		s.symtype = p[4] & ~0x80;
		p += 5;
		s.name = p;
		if(s.symtype == 'z' || s.symtype == 'Z') {
			// path reference string - skip first byte,
			// then 2-byte pairs ending at two zeros.
			q = p+1;
			for(;;) {
				if(q+2 > ep)
					return;
				if(q[0] == '\0' && q[1] == '\0')
					break;
				q += 2;
			}
			p = q+2;
		}else{
			q = runtime·mchr(p, '\0', ep);
			if(q == nil)
				break;
			p = q+1;
		}
		p += 4;	// go type
		fn(&s);
	}
}