| ## Test writing stub elf with minimal sections. |
| |
| # RUN: llvm-ifs --output-elf=%t.elf32l --arch=x86_64 --bitwidth=32 --endianness=little %s |
| # RUN: llvm-readobj -h -S --string-dump .dynstr --string-dump .shstrtab --dyn-symbols --dynamic-table %t.elf32l | FileCheck %s -DCLASS="32-bit (0x1)" -DDE="LittleEndian (0x1)" -DHS=52 -DPHES=32 -DSHES=40 -DDYNSYMAL=4 -DDYNSYMES=16 -DDYNAMICAL=4 -DDYNAMICES=8 -DDYNTABZ=0 |
| |
| # RUN: llvm-ifs --output-elf=%t.elf32b --arch=x86_64 --bitwidth=32 --endianness=big %s |
| # RUN: llvm-readobj -h -S --string-dump .dynstr --string-dump .shstrtab --dyn-symbols --dynamic-table %t.elf32b | FileCheck %s -DCLASS="32-bit (0x1)" -DDE="BigEndian (0x2)" -DHS=52 -DPHES=32 -DSHES=40 -DDYNSYMAL=4 -DDYNSYMES=16 -DDYNAMICAL=4 -DDYNAMICES=8 -DDYNTABZ=0 |
| |
| # RUN: llvm-ifs --output-elf=%t.elf64l --arch=x86_64 --bitwidth=64 --endianness=little %s |
| # RUN: llvm-readobj -h -S --string-dump .dynstr --string-dump .shstrtab --dyn-symbols --dynamic-table %t.elf64l | FileCheck %s -DCLASS="64-bit (0x2)" -DDE="LittleEndian (0x1)" -DHS=64 -DPHES=56 -DSHES=64 -DDYNSYMAL=8 -DDYNSYMES=24 -DDYNAMICAL=8 -DDYNAMICES=16 -DDYNTABZ=000000000 |
| |
| # RUN: llvm-ifs --output-elf=%t.elf64l --target=x86_64-linux-gnu %s |
| # RUN: llvm-readobj -h -S --string-dump .dynstr --string-dump .shstrtab --dyn-symbols --dynamic-table %t.elf64l | FileCheck %s -DCLASS="64-bit (0x2)" -DDE="LittleEndian (0x1)" -DHS=64 -DPHES=56 -DSHES=64 -DDYNSYMAL=8 -DDYNSYMES=24 -DDYNAMICAL=8 -DDYNAMICES=16 -DDYNTABZ=000000000 |
| |
| # RUN: llvm-ifs --output-elf=%t.elf64b --arch=x86_64 --bitwidth=64 --endianness=big %s |
| # RUN: llvm-readobj -h -S --string-dump .dynstr --string-dump .shstrtab --dyn-symbols --dynamic-table %t.elf64b | FileCheck %s -DCLASS="64-bit (0x2)" -DDE="BigEndian (0x2)" -DHS=64 -DPHES=56 -DSHES=64 -DDYNSYMAL=8 -DDYNSYMES=24 -DDYNAMICAL=8 -DDYNAMICES=16 -DDYNTABZ=000000000 |
| |
| # RUN: not llvm-ifs --output-elf=%t --arch=x86_64 --bitwidth=64 --endianness=big --target=x86_64-linux-gnu %s 2>&1 | FileCheck %s --check-prefix=TRIPLEERR |
| |
| # RUN: not llvm-ifs --output-elf=%t --bitwidth=64 --endianness=big %s 2>&1 | FileCheck %s -DMSG="Arch" --check-prefix=TARGETERR |
| |
| # RUN: not llvm-ifs --output-elf=%t --arch=x86_64 --endianness=big %s 2>&1 | FileCheck %s -DMSG="BitWidth" --check-prefix=TARGETERR |
| |
| # RUN: not llvm-ifs --output-elf=%t --arch=x86_64 --bitwidth=64 %s 2>&1 | FileCheck %s -DMSG="Endianness" --check-prefix=TARGETERR |
| |
| # RUN: llvm-ifs --output-ifs=%t.target --target=x86_64-linux-gnu %s |
| # RUN: not llvm-ifs --output-elf=%t --target=aarch64-linux-gnu %t.target 2>&1 | FileCheck %s -DMSG="Triple" --check-prefix=CONFLICTERR |
| |
| # RUN: llvm-ifs --output-ifs=%t.target --arch=x86_64 --endianness=little --bitwidth=64 %s |
| # RUN: not llvm-ifs --output-elf=%t --arch=AArch64 %t.target 2>&1 | FileCheck %s -DMSG=Arch --check-prefix=CONFLICTERR |
| # RUN: not llvm-ifs --output-elf=%t --endianness=big %t.target 2>&1 | FileCheck %s -DMSG=Endianness --check-prefix=CONFLICTERR |
| # RUN: not llvm-ifs --output-elf=%t --bitwidth=32 %t.target 2>&1 | FileCheck %s -DMSG=BitWidth --check-prefix=CONFLICTERR |
| |
| # RUN: llvm-ifs --output-ifs=%t.ifs --output-elf=%t.elf --target=x86_64-linux-gnu %s |
| # RUN: llvm-ifs --output-elf=%t.elf2 --target=x86_64-linux-gnu %t.ifs |
| # RUN: llvm-readobj -h -S --string-dump .dynstr --string-dump .shstrtab --dyn-symbols --dynamic-table %t.elf | FileCheck %s -DCLASS="64-bit (0x2)" -DDE="LittleEndian (0x1)" -DHS=64 -DPHES=56 -DSHES=64 -DDYNSYMAL=8 -DDYNSYMES=24 -DDYNAMICAL=8 -DDYNAMICES=16 -DDYNTABZ=000000000 |
| # RUN: llvm-readobj -h -S --string-dump .dynstr --string-dump .shstrtab --dyn-symbols --dynamic-table %t.elf2 | FileCheck %s -DCLASS="64-bit (0x2)" -DDE="LittleEndian (0x1)" -DHS=64 -DPHES=56 -DSHES=64 -DDYNSYMAL=8 -DDYNSYMES=24 -DDYNAMICAL=8 -DDYNAMICES=16 -DDYNTABZ=000000000 |
| |
| # RUN: llvm-ifs --output-elf=- --target=riscv64-linux-gnu %s | llvm-readelf -h - | FileCheck %s --check-prefix=MACHINE |
| |
| # RUN: not llvm-ifs --output-elf=- --arch=riscv64 --endianness=little --bitwidth=64 %s 2>&1 | FileCheck %s -DMSG=riscv64 --check-prefix=ARCHERR |
| |
| --- !ifs-v1 |
| IfsVersion: 3.0 |
| NeededLibs: |
| - libc.so.6 |
| Symbols: |
| - { Name: bar, Type: Object, Size: 42 } |
| - { Name: baz, Type: TLS, Size: 3 } |
| - { Name: plus, Type: Func } |
| ... |
| |
| # CHECK: ElfHeader { |
| # CHECK-NEXT: Ident { |
| # CHECK-NEXT: Magic: (7F 45 4C 46) |
| # CHECK-NEXT: Class: [[CLASS]] |
| # CHECK-NEXT: DataEncoding: [[DE]] |
| # 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: SharedObject (0x3) |
| # CHECK-NEXT: Machine: EM_X86_64 (0x3E) |
| # CHECK-NEXT: Version: 1 |
| # CHECK-NEXT: Entry: 0x0 |
| # CHECK: Flags [ (0x0) |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: HeaderSize: [[HS]] |
| # CHECK-NEXT: ProgramHeaderEntrySize: [[PHES]] |
| # CHECK: SectionHeaderEntrySize: [[SHES]] |
| # CHECK: SectionHeaderCount: 5 |
| # CHECK: StringTableSectionIndex: 4 |
| |
| # CHECK: Section { |
| # CHECK-NEXT: Index: 0 |
| # CHECK-NEXT: Name: (0) |
| # CHECK-NEXT: Type: SHT_NULL |
| # CHECK-NEXT: Flags [ |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: 0x0 |
| # CHECK-NEXT: Offset: 0x0 |
| # CHECK-NEXT: Size: 0 |
| # CHECK-NEXT: Link: 0 |
| # CHECK-NEXT: Info: 0 |
| # CHECK-NEXT: AddressAlignment: 0 |
| # CHECK-NEXT: EntrySize: 0 |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Section { |
| # CHECK-NEXT: Index: 1 |
| # CHECK-NEXT: Name: .dynsym |
| # CHECK-NEXT: Type: SHT_DYNSYM |
| # CHECK-NEXT: Flags [ |
| # CHECK-NEXT: SHF_ALLOC |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Size: |
| # CHECK-NEXT: Link: 2 |
| # CHECK-NEXT: Info: 1 |
| # CHECK-NEXT: AddressAlignment: [[DYNSYMAL]] |
| # CHECK-NEXT: EntrySize: [[DYNSYMES]] |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Section { |
| # CHECK-NEXT: Index: 2 |
| # CHECK-NEXT: Name: .dynstr |
| # CHECK-NEXT: Type: SHT_STRTAB |
| # CHECK-NEXT: Flags [ |
| # CHECK-NEXT: SHF_ALLOC |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Size: |
| # CHECK-NEXT: Link: 0 |
| # CHECK-NEXT: Info: 0 |
| # CHECK-NEXT: AddressAlignment: 1 |
| # CHECK-NEXT: EntrySize: 0 |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Section { |
| # CHECK-NEXT: Index: 3 |
| # CHECK-NEXT: Name: .dynamic |
| # CHECK-NEXT: Type: SHT_DYNAMIC |
| # CHECK-NEXT: Flags [ |
| # CHECK-NEXT: SHF_ALLOC |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Size: |
| # CHECK-NEXT: Link: 2 |
| # CHECK-NEXT: Info: 0 |
| # CHECK-NEXT: AddressAlignment: [[DYNAMICAL]] |
| # CHECK-NEXT: EntrySize: [[DYNAMICES]] |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Section { |
| # CHECK-NEXT: Index: 4 |
| # CHECK-NEXT: Name: .shstrtab |
| # CHECK-NEXT: Type: SHT_STRTAB |
| # CHECK-NEXT: Flags [ |
| # CHECK-NEXT: ] |
| # CHECK-NEXT: Address: |
| # CHECK-NEXT: Offset: |
| # CHECK-NEXT: Size: |
| # CHECK-NEXT: Link: 0 |
| # CHECK-NEXT: Info: 0 |
| # CHECK-NEXT: AddressAlignment: 1 |
| # CHECK-NEXT: EntrySize: 0 |
| # CHECK-NEXT: } |
| |
| # CHECK: DynamicSection [ (5 entries) |
| # CHECK-NEXT: Tag Type Name/Value |
| # CHECK-NEXT: 0x[[DYNTABZ]]0000006 SYMTAB |
| # CHECK-NEXT: 0x[[DYNTABZ]]0000005 STRTAB |
| # CHECK-NEXT: 0x[[DYNTABZ]]000000A STRSZ |
| # CHECK-NEXT: 0x[[DYNTABZ]]0000001 NEEDED Shared library: [libc.so.6] |
| # CHECK-NEXT: 0x[[DYNTABZ]]0000000 NULL |
| # CHECK-NEXT: ] |
| |
| # CHECK: Symbol { |
| # CHECK-NEXT: Name: |
| # CHECK-NEXT: Value: |
| # CHECK-NEXT: Size: |
| # CHECK-NEXT: Binding: Local |
| # CHECK-NEXT: Type: None |
| # CHECK-NEXT: Other: 0 |
| # CHECK-NEXT: Section: Undefined |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: bar |
| # CHECK-NEXT: Value: |
| # CHECK-NEXT: Size: 42 |
| # CHECK-NEXT: Binding: Global |
| # CHECK-NEXT: Type: Object |
| # CHECK-NEXT: Other: 0 |
| # CHECK-NEXT: Section: .dynsym |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: baz |
| # CHECK-NEXT: Value: |
| # CHECK-NEXT: Size: 3 |
| # CHECK-NEXT: Binding: Global |
| # CHECK-NEXT: Type: TLS |
| # CHECK-NEXT: Other: 0 |
| # CHECK-NEXT: Section: .dynsym |
| # CHECK-NEXT: } |
| # CHECK-NEXT: Symbol { |
| # CHECK-NEXT: Name: plus |
| # CHECK-NEXT: Value: |
| # CHECK-NEXT: Size: |
| # CHECK-NEXT: Binding: Global |
| # CHECK-NEXT: Type: Function |
| # CHECK-NEXT: Other: 0 |
| # CHECK-NEXT: Section: .dynsym |
| # CHECK-NEXT: } |
| |
| # CHECK: String dump of section '.dynstr': |
| # CHECK-NEXT: [ 1] baz |
| # CHECK-NEXT: [ 5] plus |
| # CHECK-NEXT: [ a] bar |
| # CHECK-NEXT: [ e] libc.so.6 |
| |
| # CHECK: String dump of section '.shstrtab': |
| # CHECK-NEXT: [ 1] .dynstr |
| # CHECK-NEXT: [ 9] .dynsym |
| # CHECK-NEXT: [ 11] .dynamic |
| # CHECK-NEXT: [ 1a] .shstrtab |
| |
| # TRIPLEERR: error: Target triple cannot be used simultaneously with ELF target format |
| # TARGETERR: error: [[MSG]] is not defined in the text stub |
| # CONFLICTERR: error: Supplied [[MSG]] conflicts with the text stub |
| |
| # MACHINE: Machine: RISC-V |
| |
| # ARCHERR: error: unknown arch '[[MSG]]' |