## Test that yaml2obj automatically assigns sh_addr to allocatable sections for ET_EXEC/ET_DYN files. # RUN: yaml2obj %s -o %t.so -D TYPE=ET_DYN # RUN: llvm-readelf --sections %t.so | FileCheck %s --check-prefix=EXE-DSO # RUN: yaml2obj %s -o %t -D TYPE=ET_EXEC # RUN: llvm-readelf --sections %t | FileCheck %s --check-prefix=EXE-DSO # RUN: yaml2obj %s -o %t.o -D TYPE=ET_REL # RUN: llvm-readelf --sections %t.o | FileCheck %s --check-prefix=REL ## We assign virtual addresses to allocatable sections automatically for executables and shared libraries. # EXE-DSO: Section Headers: # EXE-DSO-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al # EXE-DSO-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 # EXE-DSO-NEXT: [ 1] .text.any.addr PROGBITS 0000000000001000 000040 000003 00 A 0 0 0 # EXE-DSO-NEXT: [ 2] .text.shsize PROGBITS 0000000000001003 000043 001234 00 A 0 0 0 # EXE-DSO-NEXT: [ 3] .text.align PROGBITS 0000000000001100 000100 000004 00 A 0 0 256 # EXE-DSO-NEXT: [ 4] .data.any.addr PROGBITS 0000000000002000 000104 000001 00 A 0 0 0 # EXE-DSO-NEXT: [ 5] .data.after.fill PROGBITS 0000000000002101 000205 000001 00 A 0 0 0 # EXE-DSO-NEXT: [ 6] .data.go.back PROGBITS 0000000000001500 000206 000001 00 A 0 0 0 # EXE-DSO-NEXT: [ 7] .data.go.back.foo PROGBITS 0000000000001501 000207 000000 00 A 0 0 0 # EXE-DSO-NEXT: [ 8] .dynsym DYNSYM 0000000000001508 000208 000018 18 A 9 1 8 # EXE-DSO-NEXT: [ 9] .dynstr STRTAB 0000000000001520 000220 000001 00 A 0 0 1 # EXE-DSO-NEXT: [10] .strtab STRTAB 0000000000000000 000221 000001 00 0 0 1 # EXE-DSO-NEXT: [11] .shstrtab STRTAB 0000000000000000 000222 00008b 00 0 0 1 ## We do not assign virtual addresses to allocatable sections in a relocatable object ## unless YAML document has an explicit request. # REL: Section Headers: # REL-NEXT: [Nr] Name Type Address Off Size ES Flg Lk Inf Al # REL-NEXT: [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 # REL-NEXT: [ 1] .text.any.addr PROGBITS 0000000000001000 000040 000003 00 A 0 0 0 # REL-NEXT: [ 2] .text.shsize PROGBITS 0000000000000000 000043 001234 00 A 0 0 0 # REL-NEXT: [ 3] .text.align PROGBITS 0000000000000000 000100 000004 00 A 0 0 256 # REL-NEXT: [ 4] .data.any.addr PROGBITS 0000000000002000 000104 000001 00 A 0 0 0 # REL-NEXT: [ 5] .data.after.fill PROGBITS 0000000000000000 000205 000001 00 A 0 0 0 # REL-NEXT: [ 6] .data.go.back PROGBITS 0000000000001500 000206 000001 00 A 0 0 0 # REL-NEXT: [ 7] .data.go.back.foo PROGBITS 0000000000000000 000207 000000 00 A 0 0 0 # REL-NEXT: [ 8] .dynsym DYNSYM 0000000000000000 000208 000018 18 A 9 1 8 # REL-NEXT: [ 9] .dynstr STRTAB 0000000000000000 000220 000001 00 A 0 0 1 # REL-NEXT: [10] .strtab STRTAB 0000000000000000 000221 000001 00 0 0 1 # REL-NEXT: [11] .shstrtab STRTAB 0000000000000000 000222 00008b 00 0 0 1 --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: [[TYPE]] Sections: ## Show we can place a section at any address. - Name: .text.any.addr Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x1000 Size: 0x3 ## Test that ShSize does not affect virtual addresses. - Name: .text.shsize Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] ShSize: 0x1234 ## Show we respect an address align when automatically ## assign virtual addresses. - Name: .text.align Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] AddressAlign: 0x100 Size: 0x4 ## We can set another address for a subsequent section. - Name: .data.any.addr Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Address: 0x2000 Size: 0x1 ## Show that Fill occupies VA space. - Type: Fill Pattern: "AABB" Size: 0x100 - Name: .data.after.fill Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Size: 0x1 ## Show we can go back in the address space and ## continue placing sections. The order of sections in the ## section header table will match the order in the YAML description. - Name: .data.go.back Address: 0x1500 Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] Size: 0x1 - Name: .data.go.back.foo Type: SHT_PROGBITS Flags: [ SHF_ALLOC ] ## Used to trigger creation of .dynsym and .dynstr. DynamicSymbols: []