From 67f590e2867ace532b2a5d9212c4a43bcd7b9557 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Tue, 30 Apr 2019 11:02:09 +0000 Subject: [llvm-objcopy] - Check dynamic relocation sections for broken references. This is a fix for https://bugs.llvm.org/show_bug.cgi?id=41371. Currently, it is possible to break the sh_link field of the dynamic relocation section by removing the section it refers to. The patch fixes an issue and adds 2 test cases. One of them shows that it does not seem possible to break the sh_info field. I added an assert to verify this. Differential revision: https://reviews.llvm.org/D60825 llvm-svn: 359552 --- .../ELF/dynrelocsec-remove-shinfo-reference.test | 30 +++++++++++++++++++ .../ELF/dynrelocsec-remove-shlink-reference.test | 34 ++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 llvm/test/tools/llvm-objcopy/ELF/dynrelocsec-remove-shinfo-reference.test create mode 100644 llvm/test/tools/llvm-objcopy/ELF/dynrelocsec-remove-shlink-reference.test (limited to 'llvm/test/tools/llvm-objcopy/ELF') diff --git a/llvm/test/tools/llvm-objcopy/ELF/dynrelocsec-remove-shinfo-reference.test b/llvm/test/tools/llvm-objcopy/ELF/dynrelocsec-remove-shinfo-reference.test new file mode 100644 index 00000000000..a66b38d59f7 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/ELF/dynrelocsec-remove-shinfo-reference.test @@ -0,0 +1,30 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-objcopy -R .got.plt %t %t2 + +## .rela.plt is a dynamic relocation section that has a connection +## via sh_info field with its target section .got.plt. +## Here we check that if the target section is removed then dynamic +## relocation section is also removed and we do not end up with a broken +## sh_info value, for example. + +# RUN: llvm-readelf --sections %t2 \ +# RUN: | FileCheck %s --implicit-check-not=".got.plt" --implicit-check-not=".rela.plt" + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .rela.plt + Type: SHT_RELA + Flags: [ SHF_ALLOC ] + Link: .dynsym + Info: .got.plt + - Name: .got.plt + Type: SHT_PROGBITS + Flags: [ SHF_WRITE, SHF_ALLOC ] +DynamicSymbols: + - Name: bar + Binding: STB_GLOBAL diff --git a/llvm/test/tools/llvm-objcopy/ELF/dynrelocsec-remove-shlink-reference.test b/llvm/test/tools/llvm-objcopy/ELF/dynrelocsec-remove-shlink-reference.test new file mode 100644 index 00000000000..d813d30277f --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/ELF/dynrelocsec-remove-shlink-reference.test @@ -0,0 +1,34 @@ +# RUN: yaml2obj %s > %t + +## Check we cannot remove the .dynsym symbol table because dynamic +## relocation section .rela.dyn still references it via sh_link field. +# RUN: not llvm-objcopy -R .dynsym %t %t2 2>&1 >/dev/null | FileCheck %s --check-prefix=ERR +# ERR: error: Symbol table .dynsym cannot be removed because it is referenced by the relocation section .rela.dyn. + +## Check we can remove .dynsym after removing the reference. +# RUN: llvm-objcopy -R .dynsym -R .rela.dyn %t %t2 +# RUN: llvm-readelf --sections %t2 | FileCheck %s --implicit-check-not=".dynsym" + +## Check we zero out sh_link field and allow producing output with the --allow-broken-links switch. +# RUN: llvm-objcopy -R .dynsym --allow-broken-links %t %t2 +# RUN: llvm-readelf --sections %t2 | FileCheck %s --check-prefix=DROP-LINK +# DROP-LINK: [Nr] Name Type Address Off Size ES Flg L +# DROP-LINK: [ 1] .rela.dyn RELA 0000000000000270 000040 000000 18 A 0 +# DROP-LINK-NOT: .dynsym + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_DYN + Machine: EM_X86_64 +Sections: + - Name: .rela.dyn + Type: SHT_RELA + Flags: [ SHF_ALLOC ] + Address: 0x0000000000000270 + Link: .dynsym + EntSize: 0x0000000000000018 +DynamicSymbols: + - Name: bar + Binding: STB_GLOBAL -- cgit v1.2.3