summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJake Ehrlich <jakehehrlich@google.com>2018-05-15 20:53:53 +0000
committerJake Ehrlich <jakehehrlich@google.com>2018-05-15 20:53:53 +0000
commite40398ad98d2de236ea40b4bbf79f23f4d812dda (patch)
tree7ced9f6ac909ab87cd6c51512457fb7f26def3e7
parent8d522d811a6d8ec72b10dbd76ba670678bc4251b (diff)
downloadbcm5719-llvm-e40398ad98d2de236ea40b4bbf79f23f4d812dda.tar.gz
bcm5719-llvm-e40398ad98d2de236ea40b4bbf79f23f4d812dda.zip
[llvm-objcopy] Add --only-keep-debug as a noop
This option just keeps being a problem and really needs to be implemented in some fashion. Implementing it properly requires some kind of "replaceSectionReference" method because all the existing links need to be maintained. The desired behavior is just for allocated sections to become NOBITS but actually implementing that is rather tricky due to the current design of llvm-objcopy. However converting allocated sections to NOBITS is just an optimization and not something debuggers need. Debuggers can debug a stripped executable and take an unstripped executable for that stripped executable as input. Additionally allocated sections account for a very small part of debug binaries so this optimization is quite small. I propose that for the time being we implement this as a NOP so that people can use llvm-objcopy where they need to, just in a sub-optimal way. This option has already blocked a lot of people and its currently blocking me. llvm-svn: 332396
-rw-r--r--llvm/test/tools/llvm-objcopy/basic-only-keep-debug.test20
-rw-r--r--llvm/tools/llvm-objcopy/ObjcopyOpts.td2
-rw-r--r--llvm/tools/llvm-objcopy/llvm-objcopy.cpp2
3 files changed, 24 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/basic-only-keep-debug.test b/llvm/test/tools/llvm-objcopy/basic-only-keep-debug.test
new file mode 100644
index 00000000000..c35c4a5c60a
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/basic-only-keep-debug.test
@@ -0,0 +1,20 @@
+# NOTE: This test is only intended to be valid as long as --only-keep-debug is
+# implemented as a NOP. This test should fail when that changes and you
+# will need to update this test.
+
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy %t %t2
+# RUN: llvm-objcopy --only-keep-debug %t %t3
+# RUN: cmp %t2 %t3
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Content: "DEADBEEF"
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOpts.td b/llvm/tools/llvm-objcopy/ObjcopyOpts.td
index 92f2c74482c..9d1fb19c40c 100644
--- a/llvm/tools/llvm-objcopy/ObjcopyOpts.td
+++ b/llvm/tools/llvm-objcopy/ObjcopyOpts.td
@@ -88,3 +88,5 @@ defm keep_symbol : Eq<"keep-symbol">,
HelpText<"Do not remove symbol <symbol>">;
def K : JoinedOrSeparate<["-"], "K">,
Alias<keep_symbol>;
+def only_keep_debug : Flag<["-", "--"], "only-keep-debug">,
+ HelpText<"Currently ignored. Only for compaitability with GNU objcopy.">;
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 24ec18817c9..4c02b16d791 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -160,6 +160,7 @@ struct CopyConfig {
bool LocalizeHidden = false;
bool Weaken = false;
bool DiscardAll = false;
+ bool OnlyKeepDebug = false;
};
using SectionPred = std::function<bool(const SectionBase &Sec)>;
@@ -482,6 +483,7 @@ CopyConfig ParseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
Config.LocalizeHidden = InputArgs.hasArg(OBJCOPY_localize_hidden);
Config.Weaken = InputArgs.hasArg(OBJCOPY_weaken);
Config.DiscardAll = InputArgs.hasArg(OBJCOPY_discard_all);
+ Config.OnlyKeepDebug = InputArgs.hasArg(OBJCOPY_only_keep_debug);
for (auto Arg : InputArgs.filtered(OBJCOPY_localize_symbol))
Config.SymbolsToLocalize.push_back(Arg->getValue());
for (auto Arg : InputArgs.filtered(OBJCOPY_globalize_symbol))
OpenPOWER on IntegriCloud