diff --git a/llvm/test/tools/llvm-objdump/X86/disassemble-same-section-addr.test b/llvm/test/tools/llvm-objdump/X86/disassemble-same-section-addr.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/disassemble-same-section-addr.test @@ -0,0 +1,39 @@ +## This test shows that llvm-objdump can handle sections with the same address +## when symbols in those sections are referenced. In the past, the section +## picked was non-deterministic, resulting in different symbols being found for +## the section. The test uses YAML for the input, as we need a fully linked ELF +## to reproduce the original failure. + +# RUN: yaml2obj %s -o %t1 -D SECTION=.second +# RUN: llvm-objdump -d %t1 | FileCheck %s +# RUN: yaml2obj %s -o %t2 -D SECTION=.first +## FIXME: this case should print "" too. +# RUN: llvm-objdump -d %t2 | FileCheck %s --check-prefix=FAIL + +# CHECK: callq 0x5 +# FAIL: callq 0x5{{$}} + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .caller + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + Address: 0 + Content: e800000000 # Call instruction to next address. + - Name: .first + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + Address: 5 + - Name: .second + Type: SHT_PROGBITS + Flags: [SHF_ALLOC, SHF_EXECINSTR] + Address: 5 +Symbols: + - Name: target + Section: [[SECTION]] + Value: 5 diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1228,7 +1228,10 @@ std::vector> SectionAddresses; for (SectionRef Sec : Obj->sections()) SectionAddresses.emplace_back(Sec.getAddress(), Sec); - stable_sort(SectionAddresses); + stable_sort(SectionAddresses, [](const std::pair &LHS, + const std::pair &RHS) { + return LHS.first < RHS.first; + }); // Linked executables (.exe and .dll files) typically don't include a real // symbol table but they might contain an export table.