Index: llvm/test/tools/llvm-readobj/ELF/section-symbols-index.test =================================================================== --- /dev/null +++ llvm/test/tools/llvm-readobj/ELF/section-symbols-index.test @@ -0,0 +1,30 @@ +## This test verifies that the Num index starts from zero at every new Symbol table. + +# RUN: yaml2obj %s -o %t1 +# RUN: llvm-readelf -s %t1 %t1 | FileCheck %s + +# CHECK: Symbol table '.symtab' contains 3 entries: +# CHECK-NEXT: Num: {{.*}} +# CHECK-NEXT: 0: {{.*}} +# CHECK-NEXT: 1: {{.*}} +# CHECK-NEXT: 2: {{.*}} +# CHECK-EMPTY: +# CHECK: File: {{.*}} +# CHECK-EMPTY: +# CHECK: Symbol table '.symtab' contains 3 entries: +# CHECK-NEXT: Num: {{.*}} +# CHECK-NEXT: 0: {{.*}} +# CHECK-NEXT: 1: {{.*}} +# CHECK-NEXT: 2: {{.*}} + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Symbols: + - Name: foo + Value: 0x1 + - Name: bar + Value: 0x2 Index: llvm/tools/llvm-readobj/ELFDumper.cpp =================================================================== --- llvm/tools/llvm-readobj/ELFDumper.cpp +++ llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3929,21 +3929,12 @@ const Elf_Sym *FirstSym, Optional StrTable, bool IsDynamic, bool NonVisibilityBitsUsed) { - static int Idx = 0; - static bool Dynamic = true; - - // If this function was called with a different value from IsDynamic - // from last call, happens when we move from dynamic to static symbol - // table, "Num" field should be reset. - if (!Dynamic != !IsDynamic) { - Idx = 0; - Dynamic = false; - } + int Idx = Symbol - FirstSym; unsigned Bias = ELFT::Is64Bits ? 8 : 0; Field Fields[8] = {0, 8, 17 + Bias, 23 + Bias, 31 + Bias, 38 + Bias, 48 + Bias, 51 + Bias}; - Fields[0].Str = to_string(format_decimal(Idx++, 6)) + ":"; + Fields[0].Str = to_string(format_decimal(Idx, 6)) + ":"; Fields[1].Str = to_string( format_hex_no_prefix(Symbol->st_value, ELFT::Is64Bits ? 16 : 8)); Fields[2].Str = to_string(format_decimal(Symbol->st_size, 5));