[PATCH] D58173: [llvm-objcopy] Add --set-start, --change-start, --adjust-start

Eugene Leviant via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 13 05:27:14 PST 2019


evgeny777 created this revision.
evgeny777 added reviewers: jhenderson, rupprecht, jakehehrlich.
Herald added subscribers: arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a reviewer: alexshap.

https://reviews.llvm.org/D58173

Files:
  test/tools/llvm-objcopy/ELF/set-start.test
  tools/llvm-objcopy/CopyConfig.cpp
  tools/llvm-objcopy/CopyConfig.h
  tools/llvm-objcopy/ELF/ELFObjcopy.cpp
  tools/llvm-objcopy/ObjcopyOpts.td


Index: tools/llvm-objcopy/ObjcopyOpts.td
===================================================================
--- tools/llvm-objcopy/ObjcopyOpts.td
+++ tools/llvm-objcopy/ObjcopyOpts.td
@@ -237,3 +237,9 @@
 def regex
     : Flag<["-", "--"], "regex">,
       HelpText<"Permit regular expressions in name comparison">;
+
+defm set_start : Eq<"set-start", "Set the start address to <addr>">,
+                 MetaVarName<"addr">;
+defm change_start : Eq<"change-start", "Add <incr> to the start address">,
+                    MetaVarName<"incr">;
+def adjust_start : JoinedOrSeparate<["--"], "adjust-start">, Alias<change_start>;
Index: tools/llvm-objcopy/ELF/ELFObjcopy.cpp
===================================================================
--- tools/llvm-objcopy/ELF/ELFObjcopy.cpp
+++ tools/llvm-objcopy/ELF/ELFObjcopy.cpp
@@ -566,6 +566,8 @@
   if (!Config.AddGnuDebugLink.empty())
     Obj.addSection<GnuDebugLinkSection>(Config.AddGnuDebugLink);
 
+  if (Config.EntryExpr)
+    Obj.Entry = Config.EntryExpr(Obj.Entry);
   return Error::success();
 }
 
Index: tools/llvm-objcopy/CopyConfig.h
===================================================================
--- tools/llvm-objcopy/CopyConfig.h
+++ tools/llvm-objcopy/CopyConfig.h
@@ -101,6 +101,9 @@
   StringMap<SectionFlagsUpdate> SetSectionFlags;
   StringMap<StringRef> SymbolsToRename;
 
+  // Address expression options
+  std::function<uint64_t(uint64_t)> EntryExpr;
+
   // Boolean options
   bool DeterministicArchives = true;
   bool ExtractDWO = false;
Index: tools/llvm-objcopy/CopyConfig.cpp
===================================================================
--- tools/llvm-objcopy/CopyConfig.cpp
+++ tools/llvm-objcopy/CopyConfig.cpp
@@ -482,6 +482,18 @@
 
   Config.PreserveDates = InputArgs.hasArg(OBJCOPY_preserve_dates);
 
+  if (auto *Arg = InputArgs.getLastArg(OBJCOPY_set_start)) {
+    unsigned long long EAddr;
+    getAsUnsignedInteger(Arg->getValue(), 0, EAddr);
+    Config.EntryExpr = [EAddr](uint64_t) { return EAddr; };
+  }
+
+  if (auto *Arg = InputArgs.getLastArg(OBJCOPY_change_start)) {
+    long long EIncr;
+    getAsSignedInteger(Arg->getValue(), 0, EIncr);
+    Config.EntryExpr = [EIncr](uint64_t EAddr) { return EAddr + EIncr; };
+  }
+
   if (Config.DecompressDebugSections &&
       Config.CompressionType != DebugCompressionType::None) {
     error("Cannot specify --compress-debug-sections at the same time as "
Index: test/tools/llvm-objcopy/ELF/set-start.test
===================================================================
--- test/tools/llvm-objcopy/ELF/set-start.test
+++ test/tools/llvm-objcopy/ELF/set-start.test
@@ -0,0 +1,27 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy --set-start 0x1000 %t %t2
+# RUN: llvm-readobj --file-headers %t2 | FileCheck %s --check-prefix=SET
+# RUN: llvm-objcopy --change-start 0x50 %t %t3
+# RUN: llvm-readobj --file-headers %t3 | FileCheck %s --check-prefix=ADD
+# RUN: llvm-objcopy --adjust-start -128 %t %t4
+# RUN: llvm-readobj --file-headers %t4 | FileCheck %s --check-prefix=SUB
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS32
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_ARM
+  Entry:           0x1100
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x1000
+    AddressAlign:    0x0000000000001000
+    Size:            0x200
+
+#SET: Entry: 0x1000
+#ADD: Entry: 0x1150
+#SUB: Entry: 0x1080
+


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58173.186628.patch
Type: text/x-patch
Size: 3490 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190213/96a14fe6/attachment.bin>


More information about the llvm-commits mailing list