summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test')
-rw-r--r--llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test187
1 files changed, 187 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test b/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test
new file mode 100644
index 00000000000..ab01da9c842
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/ELF/symbol-shndx.test
@@ -0,0 +1,187 @@
+## Show that llvm-readobj prints symbol shndxes correctly, for valid indexes,
+## invalid indexes (i.e. section indexes that don't correspond to a real
+## section), reserved values and processor/os-specific index values, for both GNU
+## and LLVM styles.
+
+# RUN: yaml2obj --docnum=1 %s > %t1
+# RUN: llvm-readobj --symbols %t1 | FileCheck %s --check-prefix=LLVM1
+# RUN: llvm-readelf --symbols %t1 | FileCheck %s --check-prefix=GNU1
+
+# LLVM1: Name: undef
+# LLVM1: Section:
+# LLVM1-SAME: Undefined (0x0)
+# LLVM1: Name: normal
+# LLVM1: Section:
+# LLVM1-SAME: .text (0x1)
+# LLVM1: Name: common
+# LLVM1: Section:
+# LLVM1-SAME: Common (0xFFF2)
+# LLVM1: Name: absolute
+# LLVM1: Section:
+# LLVM1-SAME: Absolute (0xFFF1)
+# LLVM1: Name: proc
+# LLVM1: Section:
+# LLVM1-SAME: Processor Specific (0xFF01)
+# LLVM1: Name: os
+# LLVM1: Section:
+# LLVM1-SAME: Operating System Specific (0xFF21)
+# LLVM1: Name: reserved
+# LLVM1: Section:
+# LLVM1-SAME: Reserved (0xFFFE)
+# LLVM1: Name: xindex
+# LLVM1: Section:
+# LLVM1: .text (0x1)
+
+# GNU1: Symbol table '.symtab' contains 9 entries:
+# GNU1-NEXT: Num: {{.*}} Ndx Name
+# GNU1-NEXT: 0: {{.*}} UND
+# GNU1-NEXT: 1: {{.*}} UND undef
+# GNU1-NEXT: 2: {{.*}} 1 normal
+# GNU1-NEXT: 3: {{.*}} COM common
+# GNU1-NEXT: 4: {{.*}} ABS absolute
+# GNU1-NEXT: 5: {{.*}} PRC[0xff01] proc
+# GNU1-NEXT: 6: {{.*}} OS[0xff21] os
+# GNU1-NEXT: 7: {{.*}} RSV[0xfffe] reserved
+# GNU1-NEXT: 8: {{.*}} 1 xindex
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ - Name: .symtab_shndx
+ Type: SHT_SYMTAB_SHNDX
+ Link: .symtab
+ Entries: [ 0, 0, 0, 0, 0, 0, 0, 0, 1 ]
+Symbols:
+ - Name: undef
+ Binding: STB_GLOBAL
+ - Name: normal
+ Section: .text
+ Binding: STB_GLOBAL
+ - Name: common
+ Index: SHN_COMMON
+ Binding: STB_GLOBAL
+ - Name: absolute
+ Index: SHN_ABS
+ Binding: STB_GLOBAL
+ - Name: proc
+ Index: 0xff01
+ Binding: STB_GLOBAL
+ - Name: os
+ Index: 0xff21
+ Binding: STB_GLOBAL
+ - Name: reserved
+ Index: 0xfffe
+ Binding: STB_GLOBAL
+ - Name: xindex
+ Index: SHN_XINDEX
+ Binding: STB_GLOBAL
+
+## In this case, the index does not correspond to a real section. Check that GNU
+## style just prints the section index as normal and LLVM style prints a warning
+## (but only once for each warning).
+# RUN: yaml2obj --docnum=2 %s > %t2
+# RUN: llvm-readobj --symbols %t2 2> %t2.llvm.err | FileCheck %s --check-prefix=LLVM2
+# RUN: FileCheck %s --input-file=%t2.llvm.err --check-prefix=BAD-SHNDX --implicit-check-not=warning
+# RUN: llvm-readelf --symbols %t2 2> %t2.gnu.err | FileCheck %s --check-prefix=GNU2
+# RUN: FileCheck %s --input-file=%t2.gnu.err --allow-empty --implicit-check-not={{.}}
+
+# LLVM2: Name: bad
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x42)
+# LLVM2: Name: bad2
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x42)
+# LLVM2: Name: bad3
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x43)
+# LLVM2: Name: invalid_shndx
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x9)
+# LLVM2: Name: invalid_shndx2
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0x9)
+# LLVM2: Name: invalid_shndx3
+# LLVM2: Section:
+# LLVM2-SAME: <?> (0xA)
+
+# GNU2: Symbol table '.symtab' contains 7 entries:
+# GNU2-NEXT: Num: {{.*}} Ndx Name
+# GNU2-NEXT: 0: {{.*}} UND
+# GNU2-NEXT: 1: {{.*}} 66 bad
+# GNU2-NEXT: 2: {{.*}} 66 bad2
+# GNU2-NEXT: 3: {{.*}} 67 bad3
+# GNU2-NEXT: 4: {{.*}} 9 invalid_shndx
+# GNU2-NEXT: 5: {{.*}} 9 invalid_shndx2
+# GNU2-NEXT: 6: {{.*}} 10 invalid_shndx3
+
+# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 66
+# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 67
+# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 9
+# BAD-SHNDX: warning: '{{.*}}tmp2': invalid section index: 10
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Sections:
+ - Name: .symtab_shndx
+ Type: SHT_SYMTAB_SHNDX
+ Link: .symtab
+ Entries: [ 0, 0, 0, 0, 9, 9, 10 ]
+Symbols:
+ - Name: bad
+ Index: 0x42
+ - Name: bad2
+ Index: 0x42
+ - Name: bad3
+ Index: 0x43
+ - Name: invalid_shndx
+ Index: SHN_XINDEX
+ - Name: invalid_shndx2
+ Index: SHN_XINDEX
+ - Name: invalid_shndx3
+ Index: SHN_XINDEX
+
+## In this case, the symtab shndx section is missing, so symbols with section
+## indexes of SHN_XINDEX print as Reserved symbols.
+# RUN: yaml2obj --docnum=3 %s > %t3
+# RUN: llvm-readobj --symbols %t3 2> %t3.llvm.err | FileCheck %s --check-prefix=LLVM3
+# RUN: FileCheck %s --input-file=%t3.llvm.err --check-prefix=NO-SYMTAB-SHNDX --implicit-check-not=warning
+# RUN: llvm-readelf --symbols %t3 2> %t3.gnu.err | FileCheck %s --check-prefix=GNU3
+# RUN: FileCheck %s --input-file=%t3.gnu.err --check-prefix=NO-SYMTAB-SHNDX --implicit-check-not=warning
+
+# LLVM3: Name: no_shndx
+# LLVM3: Section:
+# LLVM3-SAME: Reserved (0xFFFF)
+# LLVM3: Name: no_shndx2
+# LLVM3: Section:
+# LLVM3-SAME: Reserved (0xFFFF)
+
+# GNU3: Symbol table '.symtab' contains 3 entries:
+# GNU3-NEXT: Num: {{.*}} Ndx Name
+# GNU3-NEXT: 0: {{.*}} UND
+# GNU3-NEXT: 1: {{.*}} RSV[0xffff] no_shndx
+# GNU3-NEXT: 2: {{.*}} RSV[0xffff] no_shndx2
+
+# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': extended symbol index (1) is past the end of the SHT_SYMTAB_SHNDX section of size 0
+# NO-SYMTAB-SHNDX: warning: '{{.*}}tmp3': extended symbol index (2) is past the end of the SHT_SYMTAB_SHNDX section of size 0
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_386
+Symbols:
+ - Name: no_shndx
+ Index: SHN_XINDEX
+ - Name: no_shndx2
+ Index: SHN_XINDEX
OpenPOWER on IntegriCloud