# RUN: yaml2obj %s -o %t
# RUN: llvm-objcopy %t %t2
# RUN: llvm-readobj --dyn-syms %t2 | FileCheck %s
## This checks that section references in the dynamic symbol table are not
## corrupted after processing a file where the sequence of section headers does
## not follow the order of their offsets. The tool avoids updating loadable
## sections, so, the content of the dynamic symbol table stays intact and the
## used section indices are preserved. In this test, the section 'dummy' comes
## first while having the offset after all other sections. If the section
## headers were sorted by their offsets by the tool, what it did before, the
## index of the '.text' section would change from '2' to '1', which resulted
## in an incorrect reference in the corresponding dynamic symbol 'foo'.
# CHECK: Name: foo
# CHECK-NEXT: Value:
# CHECK-NEXT: Size:
# CHECK-NEXT: Binding:
# CHECK-NEXT: Type:
# CHECK-NEXT: Other:
# CHECK-NEXT: Section: .text
!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_DYN
Machine: EM_X86_64
ProgramHeaders:
- Type: PT_LOAD
Flags: [ PF_X, PF_R ]
FirstSec: .text
LastSec: .text
Align: 0x1000
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
AddressAlign: 0x4
Offset: 0x1000
Content: 0000000000000000
- Name: .dynsym
Type: SHT_DYNSYM
Flags: [ SHF_ALLOC ]
Link: .dynstr
- Name: .dynstr
Type: SHT_STRTAB
Flags: [ SHF_ALLOC ]
- Name: dummy
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Offset: 0x1100
- Type: SectionHeaderTable
Sections:
## 'dummy' comes before '.text' in the section header table despite its offset
## is larger.
- Name: dummy
- Name: .text
- Name: .dynsym
- Name: .dynstr
- Name: .shstrtab
- Name: .strtab
DynamicSymbols:
- Name: foo
Type: STT_FUNC
Section: .text
Binding: STB_GLOBAL
Value: 0x0
Size: 0x8