From 66a9d0f8c6c90d4235d23d190be5494f06763c57 Mon Sep 17 00:00:00 2001 From: James Henderson Date: Thu, 18 Apr 2019 09:13:30 +0000 Subject: [llvm-objcopy][llvm-strip] Add switch to allow removing referenced sections llvm-objcopy currently emits an error if a section to be removed is referenced by another section. This is a reasonable thing to do, but is different to GNU objcopy. We should allow users who know what they are doing to have a way to produce the invalid ELF. This change adds a new switch --allow-broken-links to both llvm-strip and llvm-objcopy to do precisely that. The corresponding sh_link field is then set to 0 instead of an error being emitted. I cannot use llvm-readelf/readobj to test the link fields because they emit an error if any sections, like the .dynsym, cannot be properly loaded. Reviewed by: rupprecht, grimar Differential Revision: https://reviews.llvm.org/D60324 llvm-svn: 358649 --- .../llvm-objcopy/ELF/dynsym-error-remove-strtab.test | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'llvm/test/tools/llvm-objcopy/ELF/dynsym-error-remove-strtab.test') diff --git a/llvm/test/tools/llvm-objcopy/ELF/dynsym-error-remove-strtab.test b/llvm/test/tools/llvm-objcopy/ELF/dynsym-error-remove-strtab.test index a6df5dfa885..6e63c23acbf 100644 --- a/llvm/test/tools/llvm-objcopy/ELF/dynsym-error-remove-strtab.test +++ b/llvm/test/tools/llvm-objcopy/ELF/dynsym-error-remove-strtab.test @@ -1,3 +1,16 @@ -# RUN: not llvm-objcopy -R .dynstr %p/Inputs/dynsym.so %t 2>&1 >/dev/null | FileCheck %s +# RUN: not llvm-objcopy -R .dynstr %p/Inputs/dynsym.so %t 2>&1 >/dev/null | FileCheck %s --check-prefix=ERR +# RUN: cp %p/Inputs/dynsym.so %t2 +## Use --strip-debug to suppress the default --strip-all behavior of llvm-strip. +## TODO: Implement a better way to suppress --strip-all behavior. +# RUN: not llvm-strip --strip-debug -R .dynstr %t2 2>&1 >/dev/null | FileCheck %s --check-prefix=ERR -# CHECK: Section .dynstr cannot be removed because it is referenced by the section .dynsym +# ERR: Section .dynstr cannot be removed because it is referenced by the section .dynsym + +# RUN: llvm-objcopy --allow-broken-links -R .dynstr %p/Inputs/dynsym.so %t3 +# RUN: llvm-objdump --section-headers %t3 | FileCheck %s --check-prefix=SECTIONS --implicit-check-not=.dynstr +# RUN: cp %p/Inputs/dynsym.so %t4 +# RUN: llvm-strip --strip-debug --allow-broken-links -R .dynstr %t4 +# RUN: llvm-objdump --section-headers %t4 | FileCheck %s --check-prefix=SECTIONS --implicit-check-not=.dynstr + +# SECTIONS: .dynsym +# SECTIONS: .dynamic -- cgit v1.2.3