[llvm-objcopy][ELF] Implement --only-keep-debug
authorFangrui Song <maskray@google.com>
Thu, 24 Oct 2019 22:48:32 +0000 (15:48 -0700)
committerFangrui Song <maskray@google.com>
Tue, 5 Nov 2019 16:56:15 +0000 (08:56 -0800)
commit5ad0103d8a04cb066dfae4fc20b0dfcd9413f4d4
tree65dcbcfccb35bf5353a1bfac0b665bbf7421e1e4
parentade55d07871040d0e75b94e3d3a1eaecbd704d36
[llvm-objcopy][ELF] Implement --only-keep-debug

--only-keep-debug produces a debug file as the output that only
preserves contents of sections useful for debugging purposes (the
binutils implementation preserves SHT_NOTE and non-SHF_ALLOC sections),
by changing their section types to SHT_NOBITS and rewritting file
offsets.

See https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

The intended use case is:

```
llvm-objcopy --only-keep-debug a a.dbg
llvm-objcopy --strip-debug a b
llvm-objcopy --add-gnu-debuglink=a.dbg b
```

The current layout algorithm is incapable of deleting contents and
shrinking segments, so it is not suitable for implementing the
functionality.

This patch adds a new algorithm which assigns sh_offset to sections
first, then modifies p_offset/p_filesz of program headers. It bears a
resemblance to lld/ELF/Writer.cpp.

Reviewed By: jhenderson, jakehehrlich

Differential Revision: https://reviews.llvm.org/D67137
llvm/docs/CommandGuide/llvm-objcopy.rst
llvm/test/tools/llvm-objcopy/ELF/basic-only-keep-debug.test [deleted file]
llvm/test/tools/llvm-objcopy/ELF/only-keep-debug.test [new file with mode: 0644]
llvm/tools/llvm-objcopy/CommonOpts.td
llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp
llvm/tools/llvm-objcopy/ELF/Object.cpp
llvm/tools/llvm-objcopy/ELF/Object.h