Index: contrib/elftoolchain/libdwarf/dwarf_loclist.3 =================================================================== --- contrib/elftoolchain/libdwarf/dwarf_loclist.3 +++ contrib/elftoolchain/libdwarf/dwarf_loclist.3 @@ -145,6 +145,8 @@ .It Va lr_offset The byte offset of this operation within the containing location expression. +.It Va lr_len +The size occupied by this operation. .El .Ss Memory Management The memory area used for the descriptor array returned in argument Index: contrib/elftoolchain/libdwarf/libdwarf.h =================================================================== --- contrib/elftoolchain/libdwarf/libdwarf.h +++ contrib/elftoolchain/libdwarf/libdwarf.h @@ -113,6 +113,7 @@ Dwarf_Unsigned lr_number; Dwarf_Unsigned lr_number2; Dwarf_Unsigned lr_offset; + Dwarf_Unsigned lr_len; } Dwarf_Loc; typedef struct { Index: contrib/elftoolchain/libdwarf/libdwarf_loc.c =================================================================== --- contrib/elftoolchain/libdwarf/libdwarf_loc.c +++ contrib/elftoolchain/libdwarf/libdwarf_loc.c @@ -44,10 +44,11 @@ int count; uint64_t operand1; uint64_t operand2; - uint8_t *ps, *pe, s; + uint8_t *ps, *pe, s, *pp; count = 0; ps = p; + pp = p; pe = p + len; /* @@ -357,8 +358,10 @@ if (lbuf != NULL) { lbuf->ld_s[count].lr_number = operand1; lbuf->ld_s[count].lr_number2 = operand2; + lbuf->ld_s[count].lr_len = p - pp; } + pp = p; count++; } Index: contrib/elftoolchain/readelf/readelf.c =================================================================== --- contrib/elftoolchain/readelf/readelf.c +++ contrib/elftoolchain/readelf/readelf.c @@ -6429,12 +6429,16 @@ Dwarf_Locdesc **llbuf; Dwarf_Unsigned lowpc; Dwarf_Signed lcnt; - Dwarf_Half tag, version, pointer_size, off_size; + Dwarf_Half tag, version, pointer_size, off_size, psize; Dwarf_Error de; struct loc_at *la_list, *left, *right, *la; - unsigned int la_list_len, la_list_cap, duplicates, k; + uint64_t counter; + unsigned int la_list_len, la_list_cap, k, duplicates; int i, j, ret, has_content; + if (dwarf_get_address_size(re->dbg, &psize, &de) != DW_DLV_OK) { + errx(EXIT_FAILURE, "dwarf_get_address_size failed: %s", dwarf_errmsg(de)); + } la_list_len = 0; la_list_cap = 200; la_list = calloc(la_list_cap, sizeof(struct loc_at)); @@ -6515,7 +6519,7 @@ right = &la_list[k]; if(left->la_off == right->la_off) - duplicates += 1; + duplicates++; else la_list[k - duplicates] = *right; } @@ -6537,8 +6541,10 @@ } set_cu_context(re, la->la_cu_psize, la->la_cu_osize, la->la_cu_ver); + counter = 0; for (i = 0; i < lcnt; i++) { - printf(" %8.8jx ", (uintmax_t) la->la_off); + printf(" %8.8jx ", + (uintmax_t) la->la_off + (uintmax_t) counter); if (llbuf[i]->ld_lopc == 0 && llbuf[i]->ld_hipc == 0) { printf("\n"); continue; @@ -6552,6 +6558,7 @@ putchar('('); for (j = 0; (Dwarf_Half) j < llbuf[i]->ld_cents; j++) { + counter += llbuf[i]->ld_s[j].lr_len; dump_dwarf_loc(re, &llbuf[i]->ld_s[j]); if (j < llbuf[i]->ld_cents - 1) printf("; "); @@ -6561,6 +6568,7 @@ if (llbuf[i]->ld_lopc == llbuf[i]->ld_hipc) printf(" (start == end)"); putchar('\n'); + counter += (2 + 2 * psize); } for (i = 0; i < lcnt; i++) { dwarf_dealloc(re->dbg, llbuf[i]->ld_s, Index: lib/libdwarf/Makefile =================================================================== --- lib/libdwarf/Makefile +++ lib/libdwarf/Makefile @@ -100,7 +100,7 @@ LIBADD+= elf -SHLIB_MAJOR= 4 +SHLIB_MAJOR= 5 MAN= dwarf.3 \ dwarf_add_arange.3 \