// 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); } }
// 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); } }
// 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); } }
// 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); } }