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