case DW_AT_entry_pc:
CompileUnit *elfParseCompUnit(u8 *data, u8 *abbrevData){  int bytes;  u8 *top = data;    u32 length = elfRead4Bytes(data);  data += 4;    u16 version = elfRead2Bytes(data);  data += 2;    u32 offset = elfRead4Bytes(data);  data += 4;    u8 addrSize = *data++;  if(version != 2) {    fprintf(stderr, "Unsupported debugging information version %d\n", version);    return NULL;  }    if(addrSize != 4) {    fprintf(stderr, "Unsupported address size %d\n", addrSize);    return NULL;  }  ELFAbbrev **abbrevs = elfReadAbbrevs(abbrevData, offset);  u32 abbrevNum = elfReadLEB128(data, &bytes);  data += bytes;  ELFAbbrev *abbrev = elfGetAbbrev(abbrevs, abbrevNum);  CompileUnit *unit = (CompileUnit *)calloc(sizeof(CompileUnit), 1);  unit->top = top;  unit->length = length;  unit->abbrevs = abbrevs;  unit->next = NULL;  elfCurrentUnit = unit;    int i;    for(i = 0; i < abbrev->numAttrs; i++) {    ELFAttr *attr = &abbrev->attrs[i];    data = elfReadAttribute(data, attr);    switch(attr->name) {    case DW_AT_name:      unit->name = attr->string;      break;    case DW_AT_stmt_list:      unit->hasLineInfo = true;      unit->lineInfo = attr->value;      break;    case DW_AT_low_pc:      unit->lowPC = attr->value;      break;    case DW_AT_high_pc:      unit->highPC = attr->value;      break;    case DW_AT_compdir:      unit->compdir = attr->string;      break;      // ignore    case DW_AT_language:    case DW_AT_producer:    case DW_AT_macro_info:      break;    default:      fprintf(stderr, "Unknown attribute %02x\n", attr->name);      break;    }  }  if(abbrev->hasChildren)    elfParseCompileUnitChildren(data, unit);  return unit;}