forked from OSchip/llvm-project
[llvm-objcopy] Reorder --dump-section before --remove-section for ELF
Reorder `DumpSection` under `handleArgs` in file `ELFObjcopy.cpp`. `DumpSection` is placed before `replaceAndRemoveSections` and is therefore now the first operation under `handleArgs`. Thus, it is now performed before both `add` and `remove` section operations. Change for the MachO format at D81123. Together fixes https://bugs.llvm.org/show_bug.cgi?id=44283. Reviewed By: alexshap, jhenderson, MaskRay Differential Revision: https://reviews.llvm.org/D81097
This commit is contained in:
parent
339156ad63
commit
a018b538a6
|
@ -0,0 +1,35 @@
|
|||
# RUN: yaml2obj %s -o %t
|
||||
|
||||
## Verify that section is dumped before it is removed.
|
||||
# RUN: llvm-objcopy --dump-section .test2=%t1.dump -R .test2 %t %t1
|
||||
# RUN: od -t x1 %t1.dump | FileCheck %s --ignore-case --match-full-lines
|
||||
|
||||
# CHECK: 0000000 de ad be ef
|
||||
# CHECK-NEXT: 0000004
|
||||
|
||||
## Verify that the newly added section is not dumped.
|
||||
# RUN: echo CAFE > %t3.txt
|
||||
# RUN: not llvm-objcopy --dump-section .test3=%t3.dump --add-section .test3=%t3.txt %t %t3 2>&1 | \
|
||||
# RUN: FileCheck %s --check-prefix=NODUMP -DINPUT=%t
|
||||
|
||||
# NODUMP: error: '[[INPUT]]': section '.test3' not found
|
||||
|
||||
!ELF
|
||||
FileHeader:
|
||||
Class: ELFCLASS64
|
||||
Data: ELFDATA2LSB
|
||||
Type: ET_REL
|
||||
Machine: EM_X86_64
|
||||
Sections:
|
||||
- Name: .test1
|
||||
Type: SHT_PROGBITS
|
||||
Flags: [ ]
|
||||
- Name: .test2
|
||||
Type: SHT_PROGBITS
|
||||
Flags: [ ]
|
||||
Content: "DEADBEEF"
|
||||
- Name: .test4
|
||||
Type: SHT_PROGBITS
|
||||
Flags: [ ]
|
||||
Content: "BEEFDEAD"
|
||||
Symbols: []
|
|
@ -617,6 +617,15 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj,
|
|||
Obj.OSABI = Config.OutputArch.getValue().OSABI;
|
||||
}
|
||||
|
||||
// Dump sections before add/remove for compatibility with GNU objcopy.
|
||||
for (StringRef Flag : Config.DumpSection) {
|
||||
StringRef SectionName;
|
||||
StringRef FileName;
|
||||
std::tie(SectionName, FileName) = Flag.split('=');
|
||||
if (Error E = dumpSectionToFile(SectionName, FileName, Obj))
|
||||
return E;
|
||||
}
|
||||
|
||||
// It is important to remove the sections first. For example, we want to
|
||||
// remove the relocation sections before removing the symbols. That allows
|
||||
// us to avoid reporting the inappropriate errors about removing symbols
|
||||
|
@ -725,14 +734,6 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj,
|
|||
NewSection.Type = SHT_NOTE;
|
||||
}
|
||||
|
||||
for (const auto &Flag : Config.DumpSection) {
|
||||
std::pair<StringRef, StringRef> SecPair = Flag.split("=");
|
||||
StringRef SecName = SecPair.first;
|
||||
StringRef File = SecPair.second;
|
||||
if (Error E = dumpSectionToFile(SecName, File, Obj))
|
||||
return E;
|
||||
}
|
||||
|
||||
if (!Config.AddGnuDebugLink.empty())
|
||||
Obj.addSection<GnuDebugLinkSection>(Config.AddGnuDebugLink,
|
||||
Config.GnuDebugLinkCRC32);
|
||||
|
|
Loading…
Reference in New Issue