[PATCH] D118189: [llvm-objcopy][COFF] Implement --update-section
Alex Brachet via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 25 14:03:31 PST 2022
abrachet created this revision.
abrachet added reviewers: jhenderson, alexander-shaposhnikov, rupprecht, mstorsjo.
abrachet requested review of this revision.
Herald added subscribers: llvm-commits, MaskRay.
Herald added a project: LLVM.
https://reviews.llvm.org/D118189
Files:
llvm/test/tools/llvm-objcopy/COFF/update-section.test
llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
Index: llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
===================================================================
--- llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
+++ llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp
@@ -253,6 +253,30 @@
Characteristics);
}
+ for (StringRef Flag : Config.UpdateSection) {
+ StringRef SecName, FileName;
+ std::tie(SecName, FileName) = Flag.split("=");
+
+ auto BufOrErr = MemoryBuffer::getFile(FileName);
+ if (!BufOrErr)
+ return createFileError(FileName, errorCodeToError(BufOrErr.getError()));
+ auto Buf = std::move(*BufOrErr);
+
+ auto MutableSections = Obj.getMutableSections();
+ auto It = llvm::find_if(MutableSections, [SecName](auto &Sec) {
+ return Sec.Name == SecName;
+ });
+ if (It == MutableSections.end())
+ return createStringError(
+ errc::invalid_argument,
+ "could not find section with name '%s'", SecName.str().c_str());
+ if (It->getContents().size() < Buf->getBufferSize())
+ return createStringError(
+ errc::invalid_argument,
+ "new section cannot be larger than previous section");
+ It->setOwnedContents({Buf->getBufferStart(), Buf->getBufferEnd()});
+ }
+
if (!Config.AddGnuDebugLink.empty())
if (Error E = addGnuDebugLink(Obj, Config.AddGnuDebugLink))
return E;
Index: llvm/test/tools/llvm-objcopy/COFF/update-section.test
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-objcopy/COFF/update-section.test
@@ -0,0 +1,31 @@
+# RUN: echo -n AAAB > %t.diff
+# RUN: echo -n AAA > %t.smaller
+# RUN: echo -n AAAAA > %t.larger
+
+# RUN: yaml2obj %s -o %t
+
+# RUN: llvm-objcopy --update-section=.text=%t.diff %t - | obj2yaml | FileCheck %s
+# CHECK: SectionData: '41414142'
+
+# RUN: llvm-objcopy --update-section=.text=%t.smaller %t - | obj2yaml | FileCheck %s --check-prefix=SMALLER
+# SMALLER: SectionData: '41414100'
+
+# RUN: not llvm-objcopy --update-section=.text=%t.larger %t /dev/null 2>&1 | FileCheck %s --check-prefix=TOO-LARGE
+# TOO-LARGE: error: {{.*}}new section cannot be larger than previous section
+
+# RUN: not llvm-objcopy --update-section=.text=%t.noexist %t /dev/null
+
+# RUN: not llvm-objcopy --update-section=.noexist=%t.diff %t /dev/null 2>&1 | FileCheck %s --check-prefix=NO-SECTION
+# NO-SECTION: error: {{.*}}could not find section with name '.noexist'
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: [ ]
+sections:
+ - Name: .text
+ Characteristics: [ ]
+ Alignment: 4
+ SectionData: '41414141'
+symbols:
+...
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118189.403030.patch
Type: text/x-patch
Size: 2645 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220125/294bd1fe/attachment.bin>
More information about the llvm-commits
mailing list