[llvm] r360422 - [llvm-objcopy] Add additional testing for various cases
James Henderson via llvm-commits
llvm-commits at lists.llvm.org
Fri May 10 05:58:53 PDT 2019
Author: jhenderson
Date: Fri May 10 05:58:52 2019
New Revision: 360422
URL: http://llvm.org/viewvc/llvm-project?rev=360422&view=rev
Log:
[llvm-objcopy] Add additional testing for various cases
This patch adds a number of tests to test various cases not covered by
existing tests. All of them work correctly, with no need to change
llvm-objcopy itself, although some do indicate possible areas for
improvement.
Reviewed by: MaskRay
Differential Revision: https://reviews.llvm.org/D61727
Added:
llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_phoff.test
llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_shoff.test
llvm/trunk/test/tools/llvm-objcopy/ELF/linked-section.test
llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections-in-segments.test
llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections.test
llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-duplicate-names.test
llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-empty-string.test
llvm/trunk/test/tools/llvm-objcopy/ELF/shared-strtab-shstrtab.s
llvm/trunk/test/tools/llvm-objcopy/ELF/tail-merged-string-tables.test
Modified:
llvm/trunk/test/tools/llvm-objcopy/ELF/strip-sections.test
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_phoff.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_phoff.test?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_phoff.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_phoff.test Fri May 10 05:58:52 2019
@@ -0,0 +1,31 @@
+## If the e_phoff field is set to a value either past the end of the file, or
+## such that e_phoff + e_phnum * sizeof(Elf_Phdr) is past the end of the file,
+## we should emit an error. This test checks that the emitted error is sensible.
+
+# RUN: yaml2obj %s -o %t.o
+## Remove the default section headers so that the section header table is not invalid.
+# RUN: llvm-objcopy --strip-sections %t.o
+# RUN: cp %t.o %t2.o
+
+## Sanity check that the phdr table is at offset 64:
+# RUN: llvm-readobj --file-headers %t.o | FileCheck %s --check-prefix=VALIDATE
+# VALIDATE: ProgramHeaderOffset: 0x40{{$}}
+
+## Truncate the file to end before the program header table ends.
+# RUN: %python -c "with open('%/t.o', 'r+b') as input: input.truncate(65)"
+# RUN: not llvm-objcopy %t.o 2>&1 | FileCheck %s
+
+## Set the e_phoff field to a value much larger than the object file size.
+# RUN: %python -c "with open('%/t2.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x40000000); input.seek(32); input.write(bytes)"
+# RUN: not llvm-objcopy %t2.o 2>&1 | FileCheck %s
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+ProgramHeaders:
+ - Type: PT_LOAD
+
+# CHECK: error: program headers longer than binary
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_shoff.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_shoff.test?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_shoff.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/invalid-e_shoff.test Fri May 10 05:58:52 2019
@@ -0,0 +1,30 @@
+## If the e_shoff field is set to a value either past the end of the file, or
+## such that e_shoff + e_shnum * sizeof(Elf_Shdr) is past the end of the file,
+## we should emit an error. This test checks that the emitted error is sensible.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: cp %t.o %t2.o
+
+## Sanity check that the section header table is at offset 64:
+# RUN: llvm-readobj --file-headers %t.o | FileCheck %s --check-prefix=VALIDATE
+# VALIDATE: SectionHeaderOffset: 0x40{{$}}
+
+## Truncate the file to end before the section header table ends.
+# RUN: %python -c "with open('%/t.o', 'r+b') as input: input.truncate(65)"
+# RUN: not llvm-objcopy %t.o 2>&1 | FileCheck %s -DINPUT=%t.o
+
+## Set the e_shoff field to a value much larger than the object file size.
+# RUN: %python -c "with open('%/t2.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x40000000); input.seek(40); input.write(bytes)"
+# RUN: not llvm-objcopy %t2.o 2>&1 | FileCheck %s -DINPUT=%t2.o
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .foo
+ Type: SHT_PROGBITS
+
+# CHECK: error: '[[INPUT]]': section header table goes past the end of the file
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/linked-section.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/linked-section.test?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/linked-section.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/linked-section.test Fri May 10 05:58:52 2019
@@ -0,0 +1,29 @@
+## This test checks that if a section has a sh_link field, and one or more
+## sections are removed such that the target section index changes, then
+## llvm-objcopy correctly updates the sh_link field.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-objcopy --remove-section .foo %t.o %t2.o
+# RUN: llvm-readobj --section-headers %t2.o | FileCheck %s
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .foo
+ Type: SHT_PROGBITS
+ - Name: .bar
+ Type: SHT_PROGBITS
+ - Name: .baz
+ Type: SHT_PROGBITS
+ Link: .bar
+
+# CHECK: Index: 1
+# CHECK-NEXT: Name: .bar
+# CHECK: Name: .baz
+## Find the next "Link" line, then check the value is exactly the index of .bar.
+# CHECK: Link
+# CHECK-SAME: : 1{{$}}
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections-in-segments.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections-in-segments.test?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections-in-segments.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections-in-segments.test Fri May 10 05:58:52 2019
@@ -0,0 +1,56 @@
+## This test shows that llvm-objcopy does not baulk at overlapping sections
+## where such sections are within segments.
+## These don't really make sense, but the tool should still handle invalid
+## inputs somehow.
+# RUN: yaml2obj %s -o %t.o
+
+## First, check that the section header table appears immediately after the program
+## header table.
+# RUN: llvm-readobj --file-headers %t.o | FileCheck %s --check-prefix=SHDRS-OFFSET
+# SHDRS-OFFSET: SectionHeaderOffset: 0x78{{$}}
+
+## Binary edit the section header sh_offset field of the second section to
+## overlap the first one.
+# RUN: %python -c "with open('%/t.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x1001); input.seek(272); input.write(bytes)"
+
+## Sanity check that the binary editing modified the correct field.
+# RUN: llvm-readobj --section-headers %t.o | FileCheck %s
+
+## Check that the contents are as expected before the copy.
+# RUN: llvm-readobj -x .first -x .second %t.o | FileCheck %s --check-prefix=CONTENTS
+
+## Now check that the section contents are still correct after the copy and show that
+## llvm-objcopy hasn't "unoverlapped" these sections because they are in segments.
+# RUN: llvm-objcopy %t.o %t2.o
+# RUN: llvm-readobj --section-headers %t2.o | FileCheck %s
+# RUN: llvm-readobj -x .first -x .second %t2.o | FileCheck %s --check-prefix=CONTENTS
+
+# CHECK: Name: .first
+# CHECK: Offset: 0x1000
+# CHECK: Name: .second
+# CHECK: Offset: 0x1001
+
+# CONTENTS: Hex dump of section '.first':
+# CONTENTS-NEXT: 0x00000000 01234567
+# CONTENTS-NEXT: Hex dump of section '.second':
+# CONTENTS-NEXT: 0x00000000 23456789
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .first
+ Type: SHT_PROGBITS
+ Content: '01234567'
+ AddressAlign: 0x1000
+ - Name: .second
+ Type: SHT_PROGBITS
+ Content: '89abcdef'
+ProgramHeaders:
+ - Type: PT_LOAD
+ FileSize: 5
+ Offset: 0x1000
+ Align: 0x1000
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections.test?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/overlapping-sections.test Fri May 10 05:58:52 2019
@@ -0,0 +1,56 @@
+## This test shows that llvm-objcopy does not baulk at overlapping sections.
+## These don't really make sense, but the tool should still handle invalid
+## inputs somehow.
+# RUN: yaml2obj %s -o %t.o
+
+## First, check that the section header table appears immediately after the ELF
+## header.
+# RUN: llvm-readobj --file-headers %t.o | FileCheck %s --check-prefix=SHDRS-OFFSET
+# SHDRS-OFFSET: SectionHeaderOffset: 0x40{{$}}
+
+## Binary edit the section header sh_offset field of the second section to
+## overlap the first one.
+# RUN: %python -c "with open('%/t.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x1001); input.seek(216); input.write(bytes)"
+
+## Sanity check that the binary editing modified the correct field.
+# RUN: llvm-readobj --section-headers %t.o | FileCheck %s --check-prefix=VALIDATE
+
+# VALIDATE: Name: .first
+# VALIDATE: Offset: 0x1000
+# VALIDATE: Name: .second
+# VALIDATE: Offset: 0x1001
+
+## Check that the contents are as expected before the copy.
+# RUN: llvm-readobj -x .first -x .second %t.o | FileCheck %s --check-prefix=CONTENTS
+
+## Now check that the section contents are still correct after the copy.
+## Also characterize the behavior of llvm-objcopy in that it "unoverlaps" the
+## two sections.
+# RUN: llvm-objcopy %t.o %t2.o
+# RUN: llvm-readobj --section-headers %t2.o | FileCheck %s
+# RUN: llvm-readobj -x .first -x .second %t2.o | FileCheck %s --check-prefix=CONTENTS
+
+# CHECK: Name: .first
+# CHECK: Offset: 0x1000
+# CHECK: Name: .second
+# CHECK: Offset: 0x1004
+
+# CONTENTS: Hex dump of section '.first':
+# CONTENTS-NEXT: 0x00000000 01234567
+# CONTENTS-NEXT: Hex dump of section '.second':
+# CONTENTS-NEXT: 0x00000000 23456789
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .first
+ Type: SHT_PROGBITS
+ Content: '01234567'
+ AddressAlign: 0x1000
+ - Name: .second
+ Type: SHT_PROGBITS
+ Content: '89abcdef'
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-duplicate-names.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-duplicate-names.test?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-duplicate-names.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-duplicate-names.test Fri May 10 05:58:52 2019
@@ -0,0 +1,30 @@
+## When multiple sections have the same name, and --rename-section is specified,
+## GNU objcopy renames all these sections. This test shows that llvm-objcopy
+## does the same.
+
+## Note: we have to do this test in two stages because yaml2obj cannot handle
+## multiple sections with the same name. This has the benefit of showing that
+## we can rename to an already existing name.
+# RUN: yaml2obj %s -o %t.o
+
+## First make two sections with the same name...
+# RUN: llvm-objcopy --rename-section=.foo=.bar %t.o %t2.o
+## ... then rename them both.
+# RUN: llvm-objcopy --rename-section=.bar=.baz %t2.o %t3.o
+# RUN: llvm-readobj --sections %t3.o | FileCheck %s
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .foo
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ - Name: .bar
+ Type: SHT_PROGBITS
+
+# CHECK: Name: .baz
+# CHECK: Name: .baz
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-empty-string.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-empty-string.test?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-empty-string.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/rename-section-empty-string.test Fri May 10 05:58:52 2019
@@ -0,0 +1,24 @@
+## This test verifies that llvm-objcopy can handle renaming a section to and
+## from an empty string.
+# RUN: yaml2obj %s -o %t.o
+
+# RUN: llvm-objcopy %t.o %t2.o --rename-section=.foo=
+# RUN: llvm-readobj --sections %t2.o | FileCheck %s --check-prefix=TO
+
+# RUN: llvm-objcopy %t2.o %t3.o --rename-section==.bar
+# RUN: llvm-readobj --sections %t3.o | FileCheck %s --check-prefix=FROM
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .foo
+ Type: SHT_PROGBITS
+
+# TO: Index: 1
+# TO-NEXT: Name: (0)
+# FROM: Index: 1
+# FROM-NEXT: Name: .bar (
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/shared-strtab-shstrtab.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/shared-strtab-shstrtab.s?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/shared-strtab-shstrtab.s (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/shared-strtab-shstrtab.s Fri May 10 05:58:52 2019
@@ -0,0 +1,106 @@
+# REQUIRES: x86-registered-target
+
+## It is possible for the section header table and symbol table to share the
+## same string table for storing section and symbol names. This test shows that
+## under various circumstances, the names are still correct after llvm-objcopy
+## has copied such an object file, and that the name table is still shared.
+## This test uses the assembler rather than yaml2obj because yaml2obj generates
+## separate string tables, whereas the assembler shares them.
+
+# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux %s -o %t.o
+## Sanity check that the string tables are shared:
+# RUN: llvm-readobj --section-headers %t.o \
+# RUN: | FileCheck %s --check-prefix=VALIDATE --implicit-check-not=.shstrtab
+
+# VALIDATE: Name: .strtab
+
+## Case 1: basic copy.
+# RUN: llvm-objcopy %t.o %t.basic
+# RUN: llvm-readobj --section-headers --symbols %t.basic \
+# RUN: | FileCheck %s --check-prefix=BASIC --implicit-check-not=.shstrtab
+
+# BASIC: Sections [
+# BASIC: Name: .foo (
+# BASIC: Name: .strtab (
+# BASIC: Symbols [
+# BASIC: Name: foo (
+
+## Case 2: renaming a section.
+# RUN: llvm-objcopy %t.o %t.rename-section --rename-section .foo=.oof
+# RUN: llvm-readobj --section-headers --symbols %t.rename-section \
+# RUN: | FileCheck %s --check-prefix=SECTION-RENAME --implicit-check-not=.shstrtab
+
+# SECTION-RENAME: Sections [
+# SECTION-RENAME: Name: .oof (
+# SECTION-RENAME: Name: .strtab (
+# SECTION-RENAME: Symbols [
+# SECTION-RENAME: Name: foo (
+
+## Case 3: renaming a symbol.
+# RUN: llvm-objcopy %t.o %t.redefine-symbol --redefine-sym foo=oof
+# RUN: llvm-readobj --section-headers --symbols %t.redefine-symbol \
+# RUN: | FileCheck %s --check-prefix=SYMBOL-RENAME --implicit-check-not=.shstrtab
+
+# SYMBOL-RENAME: Sections [
+# SYMBOL-RENAME: Name: .foo (
+# SYMBOL-RENAME: Name: .strtab (
+# SYMBOL-RENAME: Symbols [
+# SYMBOL-RENAME: Name: oof (
+
+## Case 4: removing a section.
+# RUN: llvm-objcopy %t.o %t.remove-section -R .foo
+# RUN: llvm-readobj --section-headers --symbols %t.remove-section \
+# RUN: | FileCheck %s --check-prefix=SECTION-REMOVE --implicit-check-not=.shstrtab --implicit-check-not=.foo
+
+# SECTION-REMOVE: Sections [
+# SECTION-REMOVE: Name: .strtab (
+# SECTION-REMOVE: Symbols [
+# SECTION-REMOVE: Name: foo (
+
+## Case 5: removing a symbol.
+# RUN: llvm-objcopy %t.o %t.remove-symbol -N foo
+# RUN: llvm-readobj --section-headers --symbols %t.remove-symbol \
+# RUN: | FileCheck %s --check-prefix=SYMBOL-REMOVE --implicit-check-not=.shstrtab --implicit-check-not=foo
+
+# SYMBOL-REMOVE: Sections [
+# SYMBOL-REMOVE: Name: .foo (
+# SYMBOL-REMOVE: Name: .strtab (
+# SYMBOL-REMOVE: Symbols [
+
+## Case 6: adding a section.
+# RUN: llvm-objcopy %t.o %t.add-section --add-section .bar=%s
+# RUN: llvm-readobj --section-headers --symbols %t.add-section \
+# RUN: | FileCheck %s --check-prefix=SECTION-ADD --implicit-check-not=.shstrtab
+
+# SECTION-ADD: Sections [
+# SECTION-ADD: Name: .foo (
+# SECTION-ADD: Name: .strtab (
+# SECTION-ADD: Name: .bar (
+# SECTION-ADD: Symbols [
+# SECTION-ADD: Name: foo (
+
+## Case 7: adding a symbol.
+# RUN: llvm-objcopy %t.o %t.add-symbol --add-symbol bar=0x1234
+# RUN: llvm-readobj --section-headers --symbols %t.add-symbol \
+# RUN: | FileCheck %s --check-prefix=SYMBOL-ADD --implicit-check-not=.shstrtab
+
+# SYMBOL-ADD: Sections [
+# SYMBOL-ADD: Name: .foo (
+# SYMBOL-ADD: Name: .strtab (
+# SYMBOL-ADD: Symbols [
+# SYMBOL-ADD: Name: foo (
+# SYMBOL-ADD: Name: bar (
+
+## Case 8: removing all symbols.
+# RUN: llvm-objcopy %t.o %t.strip-all --strip-all
+# RUN: llvm-readobj --section-headers --symbols %t.strip-all \
+# RUN: | FileCheck %s --check-prefix=STRIP-ALL --implicit-check-not=.shstrtab
+
+# STRIP-ALL: Sections [
+# STRIP-ALL: Name: .foo (
+# STRIP-ALL: Name: .strtab (
+# STRIP-ALL: Symbols [
+# STRIP-ALL-NEXT: ]
+
+.section .foo,"a", at progbits
+foo = 0x4321
Modified: llvm/trunk/test/tools/llvm-objcopy/ELF/strip-sections.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/strip-sections.test?rev=360422&r1=360421&r2=360422&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/strip-sections.test (original)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/strip-sections.test Fri May 10 05:58:52 2019
@@ -3,6 +3,11 @@
# RUN: llvm-readobj --file-headers --program-headers %t2 | FileCheck %s
# RUN: od -t x1 -j 4096 %t2 | FileCheck %s --check-prefix=DATA
+## Sanity check the DATA-NOT line by showing that "fe ed fa ce" appears
+## if --strip-sections is not specified.
+# RUN: llvm-objcopy %t %t3
+# RUN: od -t x1 -j 4096 %t3 | FileCheck %s --check-prefix=VALIDATE
+
!ELF
FileHeader:
Class: ELFCLASS64
@@ -19,6 +24,10 @@ Sections:
Type: SHT_PROGBITS
Flags: [ ]
Content: "CAFEBABE"
+ - Name: .non_alloc_not_in_segment
+ Type: SHT_PROGBITS
+ Flags: [ ]
+ Content: "FEEDFACE"
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
@@ -26,46 +35,49 @@ ProgramHeaders:
- Section: .text
- Section: .non_alloc_in_segment
-#DATA: 0010000 de ad be ef ca fe ba be
+# DATA: 0010000 de ad be ef ca fe ba be
+# DATA-NOT: fe ed fa ce
+
+# VALIDATE: 0010000 de ad be ef ca fe ba be fe ed fa ce
+
+# CHECK: ElfHeader {
+# CHECK-NEXT: Ident {
+# CHECK-NEXT: Magic: (7F 45 4C 46)
+# CHECK-NEXT: Class: 64-bit (0x2)
+# CHECK-NEXT: DataEncoding: LittleEndian (0x1)
+# CHECK-NEXT: FileVersion: 1
+# CHECK-NEXT: OS/ABI: SystemV (0x0)
+# CHECK-NEXT: ABIVersion: 0
+# CHECK-NEXT: Unused: (00 00 00 00 00 00 00)
+# CHECK-NEXT: }
+# CHECK-NEXT: Type: Executable (0x2)
+# CHECK-NEXT: Machine: EM_X86_64 (0x3E)
+# CHECK-NEXT: Version: 1
+# CHECK-NEXT: Entry: 0x0
+# CHECK-NEXT: ProgramHeaderOffset: 0x40
+# CHECK-NEXT: SectionHeaderOffset: 0x0
+# CHECK-NEXT: Flags [ (0x0)
+# CHECK-NEXT: ]
+# CHECK-NEXT: HeaderSize: 64
+# CHECK-NEXT: ProgramHeaderEntrySize: 56
+# CHECK-NEXT: ProgramHeaderCount: 1
+# CHECK-NEXT: SectionHeaderEntrySize: 0
+# CHECK-NEXT: SectionHeaderCount: 0
+# CHECK-NEXT: StringTableSectionIndex: 0
+# CHECK-NEXT: }
-#CHECK: ElfHeader {
-#CHECK-NEXT: Ident {
-#CHECK-NEXT: Magic: (7F 45 4C 46)
-#CHECK-NEXT: Class: 64-bit (0x2)
-#CHECK-NEXT: DataEncoding: LittleEndian (0x1)
-#CHECK-NEXT: FileVersion: 1
-#CHECK-NEXT: OS/ABI: SystemV (0x0)
-#CHECK-NEXT: ABIVersion: 0
-#CHECK-NEXT: Unused: (00 00 00 00 00 00 00)
-#CHECK-NEXT: }
-#CHECK-NEXT: Type: Executable (0x2)
-#CHECK-NEXT: Machine: EM_X86_64 (0x3E)
-#CHECK-NEXT: Version: 1
-#CHECK-NEXT: Entry: 0x0
-#CHECK-NEXT: ProgramHeaderOffset: 0x40
-#CHECK-NEXT: SectionHeaderOffset: 0x0
-#CHECK-NEXT: Flags [ (0x0)
-#CHECK-NEXT: ]
-#CHECK-NEXT: HeaderSize: 64
-#CHECK-NEXT: ProgramHeaderEntrySize: 56
-#CHECK-NEXT: ProgramHeaderCount: 1
-#CHECK-NEXT: SectionHeaderEntrySize: 0
-#CHECK-NEXT: SectionHeaderCount: 0
-#CHECK-NEXT: StringTableSectionIndex: 0
-#CHECK-NEXT: }
-
-#CHECK: ProgramHeaders [
-#CHECK-NEXT: ProgramHeader {
-#CHECK-NEXT: Type: PT_LOAD (0x1)
-#CHECK-NEXT: Offset: 0x1000
-#CHECK-NEXT: VirtualAddress: 0x0
-#CHECK-NEXT: PhysicalAddress: 0x0
-#CHECK-NEXT: FileSize: 8
-#CHECK-NEXT: MemSize: 8
-#CHECK-NEXT: Flags [ (0x5)
-#CHECK-NEXT: PF_R (0x4)
-#CHECK-NEXT: PF_X (0x1)
-#CHECK-NEXT: ]
-#CHECK-NEXT: Alignment: 4096
-#CHECK-NEXT: }
-#CHECK-NEXT:]
+# CHECK: ProgramHeaders [
+# CHECK-NEXT: ProgramHeader {
+# CHECK-NEXT: Type: PT_LOAD (0x1)
+# CHECK-NEXT: Offset: 0x1000
+# CHECK-NEXT: VirtualAddress: 0x0
+# CHECK-NEXT: PhysicalAddress: 0x0
+# CHECK-NEXT: FileSize: 8
+# CHECK-NEXT: MemSize: 8
+# CHECK-NEXT: Flags [ (0x5)
+# CHECK-NEXT: PF_R (0x4)
+# CHECK-NEXT: PF_X (0x1)
+# CHECK-NEXT: ]
+# CHECK-NEXT: Alignment: 4096
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
Added: llvm/trunk/test/tools/llvm-objcopy/ELF/tail-merged-string-tables.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/tail-merged-string-tables.test?rev=360422&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/tail-merged-string-tables.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/tail-merged-string-tables.test Fri May 10 05:58:52 2019
@@ -0,0 +1,82 @@
+## This test shows that when symbol/section names are optimized in the string
+## table to share the same entry, due to tail merging, llvm-objcopy operations
+## function correctly without corrupting the names of unchanged sections/symbols.
+
+# RUN: yaml2obj %s -o %t.o
+## Sanity check that the strings have been pooled.
+# RUN: llvm-readobj %t.o --string-dump .strtab --string-dump .shstrtab \
+# RUN: | FileCheck %s --check-prefix=VALIDATE --implicit-check-not=bar --implicit-check-not=.blag
+
+# VALIDATE: String dump of section '.strtab':
+# VALIDATE: bazfoobar
+# VALIDATE: String dump of section '.shstrtab':
+# VALIDATE: .blam.blah.blag
+
+## Case 1: Basic copy.
+# RUN: llvm-objcopy %t.o %t.copy
+# RUN: llvm-readobj --section-headers --symbols %t.copy | FileCheck %s --check-prefix=COPY
+
+# COPY: Sections [
+# COPY: Name: .blam.blah.blag (
+# COPY: Name: .blah.blag (
+# COPY: Name: .blag (
+# COPY: Symbols [
+# COPY: Name: bar (
+# COPY: Name: foobar (
+# COPY: Name: bazfoobar (
+
+## Case 2: Rename section.
+# RUN: llvm-objcopy %t.o %t.rename-section --rename-section .blah.blag=.blob.blab
+# RUN: llvm-readobj --section-headers %t.rename-section \
+# RUN: | FileCheck %s --check-prefix=RENAME-SECTION
+
+# RENAME-SECTION: Sections [
+# RENAME-SECTION: Name: .blam.blah.blag (
+# RENAME-SECTION: Name: .blob.blab (
+# RENAME-SECTION: Name: .blag (
+
+## Case 3: Rename symbol.
+# RUN: llvm-objcopy %t.o %t.rename-symbol --redefine-sym foobar=raboof
+# RUN: llvm-readobj --symbols %t.rename-symbol \
+# RUN: | FileCheck %s --check-prefix=RENAME-SYMBOL
+
+# RENAME-SYMBOL: Symbols [
+# RENAME-SYMBOL: Name: bar (
+# RENAME-SYMBOL: Name: raboof (
+# RENAME-SYMBOL: Name: bazfoobar (
+
+## Case 4: Remove section.
+# RUN: llvm-objcopy %t.o %t.remove-section -R .blah.blag
+# RUN: llvm-readobj --section-headers %t.remove-section \
+# RUN: | FileCheck %s --check-prefix=REMOVE-SECTION --implicit-check-not .blah.blag
+
+# REMOVE-SECTION: Sections [
+# REMOVE-SECTION: Name: .blam.blah.blag (
+# REMOVE-SECTION: Name: .blag (
+
+## Case 5: Remove symbol.
+# RUN: llvm-objcopy %t.o %t.remove-symbol -N foobar
+# RUN: llvm-readobj --symbols %t.remove-symbol \
+# RUN: | FileCheck %s --check-prefix=REMOVE-SYMBOL --implicit-check-not foobar
+
+# REMOVE-SYMBOL: Symbols [
+# REMOVE-SYMBOL: Name: bar (
+# REMOVE-SYMBOL: Name: bazfoobar (
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .blam.blah.blag
+ Type: SHT_PROGBITS
+ - Name: .blah.blag
+ Type: SHT_PROGBITS
+ - Name: .blag
+ Type: SHT_PROGBITS
+Symbols:
+ - Name: bar
+ - Name: foobar
+ - Name: bazfoobar
More information about the llvm-commits
mailing list