diff --git a/dumpobj.cpp b/dumpobj.cpp index 53e6f42..3814bfd 100644 --- a/dumpobj.cpp +++ b/dumpobj.cpp @@ -546,9 +546,6 @@ bool dump_obj(const char *name, int fd) uint32_t type = read_32(iter); uint8_t klass = read_8(iter); uint16_t size = read_16(iter); - uint16_t tag = 0; - if (type == T_STRUCT) tag = read_16(iter); - // tag, if it's a struct... const char *opname = ".sym"; @@ -556,14 +553,38 @@ bool dump_obj(const char *name, int fd) if (version == 0) { std::string svalue; svalue = symbols[value].name; - printf("\t%s\t%s, %s, %d, %d, %d\n", + printf("\t%s\t%s, %s, %d, %d, %d", opname, name.c_str(), svalue.c_str(), type, klass, size); } if (version == 1) - printf("\t%s\t%s, %d, %d, %d, %d\n", + printf("\t%s\t%s, %d, %d, %d, %d", opname, name.c_str(), value, type, klass, size); + // it's a little more complicated than this, I believe... + /* + * type bits 1 ... 5 are T_xxxx + * then 3 bits of DT_xxx (repeatedly) + * + * eg, char ** = DT_PTR <<11 + DT_PTR << 8 + T_CHAR + */ + int t = type & 0x1f; + if ((t == T_STRUCT) || (t == T_UNION)) { + uint16_t tag = read_16(iter); + printf(", %d", tag); + } + + // need to do it until t == 0 for + // multidimensional arrays. + for ( t = type >> 5; t; t >>= 3) { + if ((t & 0x07) == DT_ARY) { + uint16_t dim = read_16(iter); + printf(", %d", dim); + } + } + + + printf("\n"); break; }