| # RUN: yaml2obj %s -o %t |
| # RUN: llvm-objcopy --remove-section=.text.bar %t %t1 |
| # RUN: llvm-readobj --section-groups %t1 | FileCheck %s |
| |
| # In this test the section .text.bar is getting removed, as a result, |
| # the indices of the sections which go after .text.bar will change, |
| # thus the fields Link, Info and the content of .group should be updated. |
| |
| # CHECK: Name: .group |
| # CHECK-NEXT: Index: 1 |
| # CHECK-NEXT: Link: 3 |
| # CHECK-NEXT: Info: 2 |
| # CHECK-NEXT: Type: COMDAT (0x1) |
| # CHECK-NEXT: Signature: foo |
| # CHECK: .text.foo (2) |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_REL |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .group |
| Type: SHT_GROUP |
| Link: .symtab |
| AddressAlign: 0x0000000000000004 |
| Info: foo |
| Members: |
| - SectionOrType: GRP_COMDAT |
| - SectionOrType: .text.foo |
| - Name: .text.bar |
| Type: SHT_PROGBITS |
| Flags: [ SHF_ALLOC, SHF_EXECINSTR ] |
| AddressAlign: 0x0000000000000010 |
| - Name: .text.foo |
| Type: SHT_PROGBITS |
| Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ] |
| AddressAlign: 0x0000000000000010 |
| Symbols: |
| - Name: .text.bar |
| Type: STT_SECTION |
| Section: .text.bar |
| - Name: .text.foo |
| Type: STT_SECTION |
| Section: .text.foo |
| - Name: bar |
| Type: STT_FUNC |
| Section: .text.bar |
| Size: 0x0000000000000000 |
| Binding: STB_WEAK |
| - Name: foo |
| Type: STT_FUNC |
| Section: .text.foo |
| Size: 0x0000000000000000 |
| Binding: STB_WEAK |
| |
| ## This checks that tool will emit an error when trying to remove the symbol |
| ## table when we have a group section linked with symtab. |
| # RUN: not llvm-objcopy -R .symtab %t %t2 2>&1 | FileCheck %s --check-prefix=ERR -DINPUT=%t |
| |
| # ERR: error: '[[INPUT]]': section '.symtab' cannot be removed because it is referenced by the group section '.group' |
| |
| ## The '.symtab' section could be removed using --allow-broken-links option. |
| # RUN: llvm-objcopy --allow-broken-links -R .symtab %t %t3 |
| # RUN: llvm-readelf --sections %t3 | FileCheck %s --check-prefix=SECTIONS |
| |
| # SECTIONS: There are 6 section headers |
| # SECTIONS: Name Type Address Off Size ES Flg Lk Inf |
| # SECTIONS-NEXT: NULL |
| # SECTIONS-NEXT: .group {{.+}} {{.+}} {{.+}} {{.+}} {{.+}} 0 0 |
| # SECTIONS-NEXT: .text.bar |
| # SECTIONS-NEXT: .text.foo |
| # SECTIONS-NEXT: .strtab |
| # SECTIONS-NEXT: .shstrtab |
| |
| ## Show that llvm-objcopy can handle a group section with a zero sh_link and |
| ## sh_info fields. |
| # RUN: llvm-objcopy --allow-broken-links -R .symtab %t3 %t4 |
| # RUN: cmp %t3 %t4 |
| |
| ## The signature symbol becomes local. Assume the intention is to localize the group. |
| ## Drop GRP_COMDAT so that the linker will suppress deduplication. |
| # RUN: llvm-objcopy --keep-global-symbol=bar %t %t5 |
| # RUN: llvm-readelf -s --section-groups %t5 | FileCheck %s --check-prefix=LOCAL-SIG |
| |
| # LOCAL-SIG: LOCAL DEFAULT [[#]] foo |
| # LOCAL-SIG: (unknown) group section [ 1] `.group' [foo] contains 1 sections: |
| |
| ## The signature symbol remains non-local. Keep GRP_COMDAT. |
| # RUN: llvm-readelf -s --section-groups %t1 | FileCheck %s --check-prefix=WEAK-SIG |
| |
| # WEAK-SIG: WEAK DEFAULT [[#]] foo |
| # WEAK-SIG: COMDAT group section [ 1] `.group' [foo] contains 1 sections: |
| |
| # RUN: llvm-objcopy --globalize-symbol=foo %t %t6 |
| # RUN: llvm-readelf -s --section-groups %t6 | FileCheck %s --check-prefix=GLOBAL-SIG |
| |
| # GLOBAL-SIG: GLOBAL DEFAULT [[#]] foo |
| # GLOBAL-SIG: COMDAT group section [ 1] `.group' [foo] contains 1 sections: |
| |
| ## If the signature is initially local and no operation has been performed to |
| ## specifically localize it, it isn't clear whether we should drop GRP_COMDAT. |
| ## The current convention is that compilers should not produce such input, so |
| ## our choice does not matter. |
| # RUN: yaml2obj --docnum=2 %s -o %t.localsig |
| # RUN: llvm-objcopy %t.localsig %t.localsig.out |
| # RUN: llvm-readelf -s --section-groups %t.localsig.out | FileCheck %s --check-prefix=LOCAL-SIG |
| |
| --- !ELF |
| FileHeader: |
| Class: ELFCLASS64 |
| Data: ELFDATA2LSB |
| Type: ET_REL |
| Machine: EM_X86_64 |
| Sections: |
| - Name: .group |
| Type: SHT_GROUP |
| Info: foo |
| Members: |
| - SectionOrType: GRP_COMDAT |
| - SectionOrType: .text.foo |
| - Name: .text.foo |
| Type: SHT_PROGBITS |
| Flags: [ SHF_GROUP ] |
| Symbols: |
| - Name: foo |
| Type: STT_FUNC |
| Section: .text.foo |