From 7bdcb225b94cf2c5f3147af97664cd25341a5a4c Mon Sep 17 00:00:00 2001 From: Georgii Rymar Date: Wed, 22 Jan 2020 15:20:36 +0300 Subject: [PATCH] [llvm-readobj] - Refine --needed-libs implementation and add a test. We have no good test for --needed-libs option. The one we have as a part of Object/readobj-shared-object.test is not complete. In this patch I've did a minor NFC changes to the implementation and added a test. This allowed to remove this piece from Object/readobj-shared-object.test Differential revision: https://reviews.llvm.org/D73174 --- test/Object/readobj-shared-object.test | 9 +- test/tools/llvm-readobj/ELF/needed-libs.test | 94 ++++++++++++++++++++ tools/llvm-readobj/ELFDumper.cpp | 4 +- 3 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 test/tools/llvm-readobj/ELF/needed-libs.test diff --git a/test/Object/readobj-shared-object.test b/test/Object/readobj-shared-object.test index 8401affc090..32b84e9f778 100644 --- a/test/Object/readobj-shared-object.test +++ b/test/Object/readobj-shared-object.test @@ -1,7 +1,7 @@ -# RUN: llvm-readobj --sections --symbols --dyn-syms --needed-libs \ +# RUN: llvm-readobj --sections --symbols --dyn-syms \ # RUN: %p/Inputs/shared-object-test.elf-i386 | FileCheck %s -# RUN: llvm-readobj --sections --symbols --dyn-syms --needed-libs \ +# RUN: llvm-readobj --sections --symbols --dyn-syms \ # RUN: %p/Inputs/shared-object-test.elf-x86-64 | FileCheck %s # CHECK: Sections [ @@ -281,8 +281,3 @@ # CHECK: Section: Absolute (0xFFF1) # CHECK: } # CHECK: ] - -# CHECK: NeededLibraries [ -# CHECK-NEXT: libc.so.6 -# CHECK-NEXT: libm.so.6 -# CHECK-NEXT: ] diff --git a/test/tools/llvm-readobj/ELF/needed-libs.test b/test/tools/llvm-readobj/ELF/needed-libs.test new file mode 100644 index 00000000000..3be99cade5d --- /dev/null +++ b/test/tools/llvm-readobj/ELF/needed-libs.test @@ -0,0 +1,94 @@ +## In this test we check the --needed-libs option. + +# RUN: yaml2obj %s --docnum=1 -o %t1 +# RUN: llvm-readobj --needed-libs %t1 \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix=NEEDED-LIBS +# RUN: llvm-readelf --needed-libs %t1 \ +# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix=NEEDED-LIBS + +## Check that library names are sorted when printed. +## Document that we also sort error entries. + +# NEEDED-LIBS:NeededLibraries [ +# NEEDED-LIBS-NEXT: +# NEEDED-LIBS-NEXT: +# NEEDED-LIBS-NEXT: aaa +# NEEDED-LIBS-NEXT: bbb +# NEEDED-LIBS-NEXT: ccc +# NEEDED-LIBS-NEXT:] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Flags: [ SHF_ALLOC ] + Content: '00616161006262620063636300' ## 0,a,a,a,0,b,b,b,0,c,c,c,0 + - Name: .dynamic + Type: SHT_DYNAMIC + Entries: + - Tag: DT_STRTAB + Value: 0x0000000000000000 + - Tag: DT_NEEDED + Value: 0x9999999 + - Tag: DT_NEEDED + Value: 9 + - Tag: DT_NEEDED + Value: 1 + - Tag: DT_NEEDED + Value: 5 + - Tag: DT_NEEDED + Value: 0x1111111 + - Tag: DT_STRSZ + Value: 0xD + - Tag: DT_NULL + Value: 0x0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x0 + Sections: + - Section: .dynstr + - Section: .dynamic + +## Check what we print when the dynamic string table is empty. +# RUN: yaml2obj %s --docnum=2 -o %t2 +# RUN: llvm-readobj --needed-libs %t2 | FileCheck %s --check-prefix=EMPTY-DYNSTR +# RUN: llvm-readelf --needed-libs %t2 | FileCheck %s --check-prefix=EMPTY-DYNSTR + +# EMPTY-DYNSTR: NeededLibraries [ +# EMPTY-DYNSTR-NEXT: +# EMPTY-DYNSTR-NEXT: ] + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .dynstr + Type: SHT_STRTAB + Flags: [ SHF_ALLOC ] + Size: 0 + - Name: .dynamic + Type: SHT_DYNAMIC + Address: 0x1000 + Entries: + - Tag: DT_STRTAB + Value: 0x0000000000000000 + - Tag: DT_NEEDED + Value: 1 + - Tag: DT_STRSZ + Value: 0x0 + - Tag: DT_NULL + Value: 0x0 +ProgramHeaders: + - Type: PT_LOAD + VAddr: 0x0 + Sections: + - Section: .dynstr + - Section: .dynamic diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index 766684624fd..f321bab44c4 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -2471,9 +2471,9 @@ template void ELFDumper::printNeededLibraries() { if (Entry.d_tag == ELF::DT_NEEDED) Libs.push_back(getDynamicString(Entry.d_un.d_val)); - llvm::stable_sort(Libs); + llvm::sort(Libs); - for (const auto &L : Libs) + for (const std::string &L : Libs) W.startLine() << L << "\n"; }