# RUN: yaml2obj --docnum=1 %s -o %t.o # RUN: echo '.*' > %t.symbols.regex ## Check that the visibility of all symbols is properly set to DEFAULT. # RUN: llvm-objcopy %t.o %t0.o --set-symbols-visibility=%t.symbols.regex=default --regex # RUN: llvm-readelf -s %t0.o | FileCheck %s --check-prefix=DEF # DEF-DAG: DEFAULT 1 default_local # DEF-DAG: DEFAULT 1 internal_local # DEF-DAG: DEFAULT 1 hidden_local # DEF-DAG: DEFAULT 1 protected_local # DEF-DAG: DEFAULT 1 default_global # DEF-DAG: DEFAULT 1 default_weak # DEF-DAG: DEFAULT 1 internal_global # DEF-DAG: DEFAULT 1 internal_weak # DEF-DAG: DEFAULT 1 hidden_global # DEF-DAG: DEFAULT 1 hidden_weak # DEF-DAG: DEFAULT 1 protected_global # DEF-DAG: DEFAULT 1 protected_weak ## Check that the visibility of all symbols is properly set to HIDDEN. # RUN: llvm-objcopy %t.o %t1.o --set-symbols-visibility=%t.symbols.regex=hidden --regex # RUN: llvm-readelf -s %t1.o | FileCheck %s --check-prefix=HID # HID-DAG: HIDDEN 1 default_local # HID-DAG: HIDDEN 1 internal_local # HID-DAG: HIDDEN 1 hidden_local # HID-DAG: HIDDEN 1 protected_local # HID-DAG: HIDDEN 1 default_global # HID-DAG: HIDDEN 1 default_weak # HID-DAG: HIDDEN 1 internal_global # HID-DAG: HIDDEN 1 internal_weak # HID-DAG: HIDDEN 1 hidden_global # HID-DAG: HIDDEN 1 hidden_weak # HID-DAG: HIDDEN 1 protected_global # HID-DAG: HIDDEN 1 protected_weak ## Check that the visibility of all symbols is properly set to PROTECTED. # RUN: llvm-objcopy %t.o %t2.o --set-symbols-visibility=%t.symbols.regex=protected --regex # RUN: llvm-readelf -s %t2.o | FileCheck %s --check-prefix=PRO # PRO-DAG: PROTECTED 1 default_local # PRO-DAG: PROTECTED 1 internal_local # PRO-DAG: PROTECTED 1 hidden_local # PRO-DAG: PROTECTED 1 protected_local # PRO-DAG: PROTECTED 1 default_global # PRO-DAG: PROTECTED 1 default_weak # PRO-DAG: PROTECTED 1 internal_global # PRO-DAG: PROTECTED 1 internal_weak # PRO-DAG: PROTECTED 1 hidden_global # PRO-DAG: PROTECTED 1 hidden_weak # PRO-DAG: PROTECTED 1 protected_global # PRO-DAG: PROTECTED 1 protected_weak ## Check that the visibility of all symbols is properly set to INTERNAL. # RUN: llvm-objcopy %t.o %t3.o --set-symbols-visibility=%t.symbols.regex=internal --regex # RUN: llvm-readelf -s %t3.o | FileCheck %s --check-prefix=INT # INT-DAG: INTERNAL 1 default_local # INT-DAG: INTERNAL 1 internal_local # INT-DAG: INTERNAL 1 hidden_local # INT-DAG: INTERNAL 1 protected_local # INT-DAG: INTERNAL 1 default_global # INT-DAG: INTERNAL 1 default_weak # INT-DAG: INTERNAL 1 internal_global # INT-DAG: INTERNAL 1 internal_weak # INT-DAG: INTERNAL 1 hidden_global # INT-DAG: INTERNAL 1 hidden_weak # INT-DAG: INTERNAL 1 protected_global # INT-DAG: INTERNAL 1 protected_weak ## Check that setting the visibility of certain symbols that were read from ## a file does not affect other symbols. # RUN: echo -e "default_local\ninternal_local" > %t.symbol.list # RUN: llvm-objcopy %t.o %t4.o --set-symbols-visibility=%t.symbol.list=hidden # RUN: llvm-readelf -s %t4.o | FileCheck %s --check-prefix=FILE # FILE-DAG: HIDDEN 1 default_local # FILE-DAG: HIDDEN 1 internal_local ## Unaffected symbols: # FILE-DAG: HIDDEN 1 hidden_local # FILE-DAG: PROTECTED 1 protected_local # FILE-DAG: DEFAULT 1 default_global # FILE-DAG: DEFAULT 1 default_weak # FILE-DAG: INTERNAL 1 internal_global # FILE-DAG: INTERNAL 1 internal_weak # FILE-DAG: HIDDEN 1 hidden_global # FILE-DAG: HIDDEN 1 hidden_weak # FILE-DAG: PROTECTED 1 protected_global # FILE-DAG: PROTECTED 1 protected_weak ## Check that the visibility of a single symbol is set correctly, ## and that no other symbols are affected. # RUN: llvm-objcopy %t.o %t5.o --set-symbol-visibility=default_local=hidden \ # RUN: --set-symbol-visibility=internal_local=protected \ # RUN: --set-symbol-visibility=hidden_local=internal \ # RUN: --set-symbol-visibility=protected_local=default # RUN: llvm-readelf -s %t5.o | FileCheck %s --check-prefix=SINGLE # SINGLE-DAG: HIDDEN 1 default_local # SINGLE-DAG: PROTECTED 1 internal_local # SINGLE-DAG: INTERNAL 1 hidden_local # SINGLE-DAG: DEFAULT 1 protected_local ## Unaffected symbols: # SINGLE-DAG: DEFAULT 1 default_global # SINGLE-DAG: DEFAULT 1 default_weak # SINGLE-DAG: INTERNAL 1 internal_global # SINGLE-DAG: INTERNAL 1 internal_weak # SINGLE-DAG: HIDDEN 1 hidden_global # SINGLE-DAG: HIDDEN 1 hidden_weak # SINGLE-DAG: PROTECTED 1 protected_global # SINGLE-DAG: PROTECTED 1 protected_weak ## Check that the visibility of symbols specified by a regex are set correctly, ## and that no other symbols are affected. # RUN: llvm-objcopy %t.o %t6.o --set-symbol-visibility='.*'_local=hidden --regex # RUN: llvm-readelf -s %t6.o | FileCheck %s --check-prefix=REGEX # REGEX-DAG: HIDDEN 1 default_local # REGEX-DAG: HIDDEN 1 internal_local # REGEX-DAG: HIDDEN 1 hidden_local # REGEX-DAG: HIDDEN 1 protected_local ## Unaffected symbols: # REGEX-DAG: DEFAULT 1 default_global # REGEX-DAG: DEFAULT 1 default_weak # REGEX-DAG: INTERNAL 1 internal_global # REGEX-DAG: INTERNAL 1 internal_weak # REGEX-DAG: HIDDEN 1 hidden_global # REGEX-DAG: HIDDEN 1 hidden_weak # REGEX-DAG: PROTECTED 1 protected_global # REGEX-DAG: PROTECTED 1 protected_weak ## Check that the visibility of symbols specified by a wildcard are set correctly, ## and that no other symbols are affected. # RUN: llvm-objcopy %t.o %t7.o --set-symbol-visibility='*_local'=hidden --wildcard # RUN: llvm-readelf -s %t7.o | FileCheck %s --check-prefix=WILDCARD # WILDCARD-DAG: HIDDEN 1 default_local # WILDCARD-DAG: HIDDEN 1 internal_local # WILDCARD-DAG: HIDDEN 1 hidden_local # WILDCARD-DAG: HIDDEN 1 protected_local ## Unaffected symbols: # WILDCARD-DAG: DEFAULT 1 default_global # WILDCARD-DAG: DEFAULT 1 default_weak # WILDCARD-DAG: INTERNAL 1 internal_global # WILDCARD-DAG: INTERNAL 1 internal_weak # WILDCARD-DAG: HIDDEN 1 hidden_global # WILDCARD-DAG: HIDDEN 1 hidden_weak # WILDCARD-DAG: PROTECTED 1 protected_global # WILDCARD-DAG: PROTECTED 1 protected_weak ## Check that the latest option that matches the same symbols as any of the previous ## options overwrites the visibility of these symbols. # RUN: echo -e '*_weak\n*_local' > %t.symbols.pattern # RUN: llvm-objcopy %t.o %t8.o --set-symbol-visibility='default_*'=hidden \ # RUN: --set-symbol-visibility='internal_*'=hidden \ # RUN: --set-symbols-visibility=%t.symbols.pattern=protected \ # RUN: --wildcard # RUN: llvm-readelf -s %t8.o | FileCheck %s --check-prefix=REWRITE # REWRITE-DAG: PROTECTED 1 default_local # REWRITE-DAG: HIDDEN 1 default_global # REWRITE-DAG: PROTECTED 1 default_weak # REWRITE-DAG: PROTECTED 1 internal_local # REWRITE-DAG: HIDDEN 1 internal_global # REWRITE-DAG: PROTECTED 1 internal_weak # REWRITE-DAG: PROTECTED 1 hidden_local # REWRITE-DAG: PROTECTED 1 hidden_weak # REWRITE-DAG: PROTECTED 1 protected_local # REWRITE-DAG: PROTECTED 1 protected_weak ## Unaffected symbols: # REWRITE-DAG: HIDDEN 1 hidden_global # REWRITE-DAG: PROTECTED 1 protected_global ## Check that a symbol name with a special charater is treated as a plain name ## when pattern matching options are not enabled. # RUN: yaml2obj --docnum=2 %s -o %t9.o # RUN: llvm-objcopy %t9.o --set-symbol-visibility='f*o'=hidden # RUN: llvm-readelf -s %t9.o | FileCheck %s --check-prefix=SPECIAL # SPECIAL-DAG: HIDDEN 1 f*o ## Unaffected symbol: # SPECIAL-DAG: DEFAULT 1 foo # RUN: yaml2obj --docnum=3 %s -o %t10.o ## Check that the visibility of undefined symbols can be changed as well. # RUN: llvm-objcopy %t10.o --set-symbol-visibility=foo=hidden # RUN: llvm-readelf -s %t10.o | FileCheck %s --check-prefix=UNDEF # UNDEF: HIDDEN UND foo ## Check that passing an invalid visibility type generates an error message. # RUN: echo 'foo' > %t.symbols # RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols=invalid-type 2>&1 | \ # RUN: FileCheck %s --check-prefix=TYPE # RUN: not llvm-objcopy %t10.o --set-symbol-visibility=foo=invalid-type 2>&1 | \ # RUN: FileCheck %s --check-prefix=TYPE # TYPE: error: 'invalid-type' is not a valid symbol visibility ## Check that omitting the '=' character generates an error. # RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols,hidden 2>&1 | \ # RUN: FileCheck %s --check-prefix=FORMAT -DOPTION=--set-symbols-visibility # RUN: not llvm-objcopy %t10.o --set-symbol-visibility=foo default 2>&1 | \ # RUN: FileCheck %s --check-prefix=FORMAT -DOPTION=--set-symbol-visibility # FORMAT: error: bad format for [[OPTION]] ## Check that using an invalid symbol pattern generates an error. # RUN: echo '*.' > %t.symbols.regex # RUN: not llvm-objcopy %t10.o --set-symbols-visibility=%t.symbols.regex=hidden --regex 2>&1 | \ # RUN: FileCheck %s --check-prefix=SYMBOL # RUN: not llvm-objcopy %t10.o --set-symbol-visibility='*.'=default --regex 2>&1 | \ # RUN: FileCheck %s --check-prefix=SYMBOL # SYMBOL: error: cannot compile regular expression '*.': repetition-operator operand invalid ## Check passing an invalid filename generates an error. # RUN: not llvm-objcopy %t10.o --set-symbols-visibility=no_file=hidden 2>&1 | \ # RUN: FileCheck %s --check-prefix=NO_FILE -DMSG=%errc_ENOENT # NO_FILE: error: 'no_file': [[MSG]] --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Machine: EM_X86_64 Sections: - Name: .text Type: SHT_PROGBITS Symbols: - Name: default_local Section: .text Binding: STB_LOCAL - Name: protected_local Section: .text Binding: STB_LOCAL Other: [ STV_PROTECTED ] - Name: internal_local Section: .text Binding: STB_LOCAL Other: [ STV_INTERNAL ] - Name: hidden_local Section: .text Binding: STB_LOCAL Other: [ STV_HIDDEN ] - Name: default_weak Section: .text Binding: STB_WEAK - Name: internal_weak Section: .text Binding: STB_WEAK Other: [ STV_INTERNAL ] - Name: hidden_weak Section: .text Binding: STB_WEAK Other: [ STV_HIDDEN ] - Name: protected_weak Section: .text Binding: STB_WEAK Other: [ STV_PROTECTED ] - Name: default_global Section: .text Binding: STB_GLOBAL - Name: internal_global Section: .text Binding: STB_GLOBAL Other: [ STV_INTERNAL ] - Name: hidden_global Section: .text Binding: STB_GLOBAL Other: [ STV_HIDDEN ] - Name: protected_global Section: .text Binding: STB_GLOBAL Other: [ STV_PROTECTED ] - Name: ignored_name Section: .text Binding: STB_GLOBAL Other: [ STV_INTERNAL ] ... --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Machine: EM_X86_64 Sections: - Name: .text Type: SHT_PROGBITS Symbols: - Name: f*o Section: .text Binding: STB_LOCAL - Name: foo Section: .text Binding: STB_LOCAL ... --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Machine: EM_X86_64 Symbols: - Name: foo Binding: STB_LOCAL ...