xref: /llvm-project/llvm/test/tools/llvm-objcopy/ELF/add-symbol-no-symtab.test (revision d8e65585f7c7cddd63920d122a9e6368d91c9389)
19dce25a9SFangrui Song## Test --add-symbol creates .symtab if it does not exist.
29dce25a9SFangrui Song
39dce25a9SFangrui Song# RUN: yaml2obj --docnum=1 %s -o %t
49dce25a9SFangrui Song
59dce25a9SFangrui Song## If a non-SHF_ALLOC SHT_STRTAB exists but SHT_SYMTAB does not, create .symtab
69dce25a9SFangrui Song## and set its sh_link to the SHT_STRTAB.
727cb352fSFangrui Song# RUN: llvm-objcopy --remove-section=.symtab %t %t.no.symtab
827cb352fSFangrui Song# RUN: llvm-objcopy --add-symbol='abs1=1' %t.no.symtab %t.add.both
927cb352fSFangrui Song# RUN: llvm-readobj -S %t.add.both | FileCheck --check-prefix=SEC %s
1027cb352fSFangrui Song# RUN: llvm-readelf -s %t.add.both | FileCheck %s
119dce25a9SFangrui Song
129dce25a9SFangrui Song# SEC:      Index: 1
139dce25a9SFangrui Song# SEC-NEXT: Name: .strtab
149dce25a9SFangrui Song# SEC-NEXT: Type: SHT_STRTAB
159dce25a9SFangrui Song# SEC:      Index: 2
169dce25a9SFangrui Song# SEC-NEXT: Name: .shstrtab
179dce25a9SFangrui Song# SEC-NEXT: Type: SHT_STRTAB
189dce25a9SFangrui Song# SEC:      Index: 3
199dce25a9SFangrui Song# SEC-NEXT: Name: .symtab
209dce25a9SFangrui Song# SEC-NEXT: Type: SHT_SYMTAB
219dce25a9SFangrui Song# SEC-NOT:  }
229dce25a9SFangrui Song# SEC:      Link: 1
239dce25a9SFangrui Song
249dce25a9SFangrui Song# CHECK:      0: 0000000000000000 0 NOTYPE LOCAL  DEFAULT UND
259dce25a9SFangrui Song# CHECK-NEXT: 1: 0000000000000001 0 NOTYPE GLOBAL DEFAULT ABS abs1
269dce25a9SFangrui Song
279dce25a9SFangrui Song## Don't create .symtab if --add-symbol is not specified.
2827cb352fSFangrui Song# RUN: llvm-objcopy --remove-section=.symtab --remove-section=.strtab %t %t.no
2927cb352fSFangrui Song# RUN: llvm-objcopy %t.no %t.nop
3027cb352fSFangrui Song# RUN: llvm-readobj -S %t.nop | FileCheck --implicit-check-not=.symtab --implicit-check-not=.strtab /dev/null
319dce25a9SFangrui Song
3227cb352fSFangrui Song## Reuse the existing .shstrtab (section names) for symbol names.
339dce25a9SFangrui Song## This may look strange but it works.
3427cb352fSFangrui Song# RUN: llvm-objcopy --add-symbol='abs1=1' %t.no %t.add.symtab
3527cb352fSFangrui Song# RUN: llvm-readobj -S %t.add.symtab | FileCheck --check-prefix=SEC2 %s --implicit-check-not=.strtab
3627cb352fSFangrui Song# RUN: llvm-readelf -s %t.add.symtab | FileCheck %s
379dce25a9SFangrui Song
389dce25a9SFangrui Song# SEC2:      Index: 1
399dce25a9SFangrui Song# SEC2-NEXT: Name: .shstrtab
409dce25a9SFangrui Song# SEC2-NEXT: Type: SHT_STRTAB
419dce25a9SFangrui Song# SEC2:      Index: 2
429dce25a9SFangrui Song# SEC2-NEXT: Name: .symtab
439dce25a9SFangrui Song# SEC2-NEXT: Type: SHT_SYMTAB
449dce25a9SFangrui Song# SEC2-NOT:  }
459dce25a9SFangrui Song# SEC2:      Link: 1
469dce25a9SFangrui Song
479dce25a9SFangrui Song--- !ELF
489dce25a9SFangrui SongFileHeader:
499dce25a9SFangrui Song  Class:   ELFCLASS64
509dce25a9SFangrui Song  Data:    ELFDATA2LSB
519dce25a9SFangrui Song  Type:    ET_REL
529dce25a9SFangrui Song  Machine: EM_X86_64
5327cb352fSFangrui SongSections:
5427cb352fSFangrui Song  - Name: .strtab
5527cb352fSFangrui Song    Type: SHT_STRTAB
5627cb352fSFangrui Song  - Name: .shstrtab
5727cb352fSFangrui Song    Type: SHT_STRTAB
5827cb352fSFangrui SongSymbols: []
5927cb352fSFangrui Song...
6027cb352fSFangrui Song
6127cb352fSFangrui Song## Check that we prefer the string table that is not the section header string table.
6227cb352fSFangrui Song# RUN: yaml2obj --docnum=2 %s -o %t2
6327cb352fSFangrui Song# RUN: llvm-objcopy --remove-section=.symtab --remove-section=.strtab %t2 %t2.no
6427cb352fSFangrui Song# RUN: llvm-objcopy --add-symbol='abs1=1' %t2.no %t2.add.symtab
6527cb352fSFangrui Song# RUN: llvm-readobj -S %t2.add.symtab | FileCheck --check-prefix=SEC2 %s
6627cb352fSFangrui Song# RUN: llvm-readelf -s %t2.add.symtab | FileCheck %s
6727cb352fSFangrui Song
6827cb352fSFangrui Song--- !ELF
6927cb352fSFangrui SongFileHeader:
7027cb352fSFangrui Song  Class:   ELFCLASS64
7127cb352fSFangrui Song  Data:    ELFDATA2LSB
7227cb352fSFangrui Song  Type:    ET_REL
7327cb352fSFangrui Song  Machine: EM_X86_64
7427cb352fSFangrui SongSections:
7527cb352fSFangrui Song  # .shstrtab is reordered before .strtab
7627cb352fSFangrui Song  - Name: .shstrtab
7727cb352fSFangrui Song    Type: SHT_STRTAB
7827cb352fSFangrui Song  - Name: .strtab
7927cb352fSFangrui Song    Type: SHT_STRTAB
8027cb352fSFangrui SongSymbols: []
819dce25a9SFangrui Song...
829dce25a9SFangrui Song
839dce25a9SFangrui Song## Check the created .symtab does not link to .dynstr (SHF_ALLOC).
8427cb352fSFangrui Song# RUN: yaml2obj --docnum=3 %s -o %t3
8527cb352fSFangrui Song# RUN: llvm-objcopy --remove-section=.symtab --remove-section=.strtab %t3 %t3.no
8627cb352fSFangrui Song# RUN: llvm-objcopy --add-symbol='abs1=1' %t3.no %t3.not.dynstr
8727cb352fSFangrui Song# RUN: llvm-readobj -S %t3.not.dynstr | FileCheck --check-prefix=SEC3 %s
889dce25a9SFangrui Song
893439d4eeSGeorgii Rymar# SEC3:      Index: 3
909dce25a9SFangrui Song# SEC3-NEXT: Name: .shstrtab
919dce25a9SFangrui Song# SEC3-NEXT: Type: SHT_STRTAB
929dce25a9SFangrui Song# SEC3:      Name: .symtab
939dce25a9SFangrui Song# SEC3-NEXT: Type: SHT_SYMTAB
949dce25a9SFangrui Song# SEC3-NOT:  }
953439d4eeSGeorgii Rymar# SEC3:      Link: 3
969dce25a9SFangrui Song
979dce25a9SFangrui Song--- !ELF
989dce25a9SFangrui SongFileHeader:
999dce25a9SFangrui Song  Class:   ELFCLASS64
1009dce25a9SFangrui Song  Data:    ELFDATA2LSB
1019dce25a9SFangrui Song  Type:    ET_DYN
1029dce25a9SFangrui Song  Machine: EM_X86_64
1039dce25a9SFangrui SongDynamicSymbols:
1049dce25a9SFangrui Song  - Name:    dummy
1059dce25a9SFangrui Song    Binding: STB_GLOBAL
10627cb352fSFangrui SongSymbols: []
1079dce25a9SFangrui Song...
108*d8e65585SAlex Orlov
109*d8e65585SAlex Orlov## Check the created .symtab is correct when there are program headers.
110*d8e65585SAlex Orlov# RUN: yaml2obj --docnum=4 %s -o %t4
111*d8e65585SAlex Orlov# RUN: llvm-objcopy %t4 %t4.add --add-symbol foo=1234
112*d8e65585SAlex Orlov# RUN: llvm-readelf -s %t4.add | FileCheck --check-prefix=SEC4 %s
113*d8e65585SAlex Orlov
114*d8e65585SAlex Orlov# SEC4:      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT   UND
115*d8e65585SAlex Orlov# SEC4-NEXT: 1: 00000000000004d2     0 NOTYPE  GLOBAL DEFAULT   ABS foo
116*d8e65585SAlex Orlov
117*d8e65585SAlex Orlov--- !ELF
118*d8e65585SAlex OrlovFileHeader:
119*d8e65585SAlex Orlov  Class:   ELFCLASS64
120*d8e65585SAlex Orlov  Data:    ELFDATA2LSB
121*d8e65585SAlex Orlov  Type:    ET_DYN
122*d8e65585SAlex Orlov  Machine: EM_X86_64
123*d8e65585SAlex OrlovSections:
124*d8e65585SAlex Orlov  - Name:    .foo
125*d8e65585SAlex Orlov    Type:    SHT_PROGBITS
126*d8e65585SAlex OrlovProgramHeaders:
127*d8e65585SAlex Orlov  - Type:     PT_LOAD
128*d8e65585SAlex Orlov    FirstSec: .foo
129*d8e65585SAlex Orlov    LastSec:  .foo
130*d8e65585SAlex Orlov...
131