# 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