[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