Skip to content

Commit

Permalink
[llvm-objcopy] Add basic support for --rename-section
Browse files Browse the repository at this point in the history
Summary:
Add basic support for --rename-section=old=new to llvm-objcopy.

A full replacement for GNU objcopy requires also modifying flags (i.e. --rename-section=old=new,flag1,flag2); I'd like to keep that in a separate change to keep this simple.

Reviewers: jakehehrlich, alexshap

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D49576
  • Loading branch information
rupprecht committed Jul 20, 2018
1 parent 92e0086 commit 29f8275
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 0 deletions.
41 changes: 41 additions & 0 deletions llvm/test/tools/llvm-objcopy/rename-section-multiple.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# RUN: yaml2obj %s > %t
# RUN: llvm-objcopy --rename-section=.test1=.test2 --rename-section=.test3=.test4 --rename-section=.test5=.test6 %t %t2
# RUN: llvm-readobj -file-headers -sections -section-data %t2 | FileCheck %s

!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .test1
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "c3c3c3c3"
- Name: .test3
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "abababab"
- Name: .test7
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "37373737"

# CHECK: SectionHeaderCount: 7

# CHECK: Name: .test2
# CHECK: SectionData (
# CHECK-NEXT: 0000: C3C3C3C3
# CHECK-NEXT: )
# CHECK: Name: .test4
# CHECK: SectionData (
# CHECK-NEXT: 0000: ABABABAB
# CHECK-NEXT: )
# CHECK: Name: .test7
# CHECK: SectionData (
# CHECK-NEXT: 0000: 37373737
# CHECK-NEXT: )
# CHECK: Name: .symtab
# CHECK: Name: .strtab
# CHECK: Name: .shstrtab
30 changes: 30 additions & 0 deletions llvm/test/tools/llvm-objcopy/rename-section.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# RUN: yaml2obj %s > %t
# RUN: llvm-objcopy --rename-section=.foo=.bar %t %t2
# RUN: llvm-readobj -file-headers -sections -section-data %t2 | FileCheck %s
# RUN: not llvm-objcopy --rename-section=.foo.bar --rename-section=.foo=.other %t %t2 2>&1 | FileCheck %s --check-prefix=BAD-FORMAT
# RUN: not llvm-objcopy --rename-section=.foo=.bar --rename-section=.foo=.other %t %t2 2>&1 | FileCheck %s --check-prefix=MULTIPLE-RENAMES

!ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .foo
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
Content: "c3c3c3c3"

# CHECK: SectionHeaderCount: 5

# CHECK: Name: .bar
# CHECK: SectionData (
# CHECK-NEXT: 0000: C3C3C3C3
# CHECK-NEXT: )
# CHECK: Name: .symtab
# CHECK: Name: .strtab
# CHECK: Name: .shstrtab

#BAD-FORMAT: Bad format for --rename-section
#MULTIPLE-RENAMES: Already have a section rename for .foo
3 changes: 3 additions & 0 deletions llvm/tools/llvm-objcopy/ObjcopyOpts.td
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ defm add_gnu_debuglink : Eq<"add-gnu-debuglink">,
defm remove_section : Eq<"remove-section">,
MetaVarName<"section">,
HelpText<"Remove <section>">;
defm rename_section : Eq<"rename-section">,
MetaVarName<"old=new">,
HelpText<"Renames a section from old to new">;
defm redefine_symbol : Eq<"redefine-sym">,
MetaVarName<"old=new">,
HelpText<"Change the name of a symbol old to new">;
Expand Down
17 changes: 17 additions & 0 deletions llvm/tools/llvm-objcopy/llvm-objcopy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ struct CopyConfig {
std::vector<StringRef> SymbolsToWeaken;
std::vector<StringRef> SymbolsToRemove;
std::vector<StringRef> SymbolsToKeep;
StringMap<StringRef> SectionsToRename;
StringMap<StringRef> SymbolsToRename;
bool StripAll = false;
bool StripAllGNU = false;
Expand Down Expand Up @@ -430,6 +431,14 @@ static void HandleArgs(const CopyConfig &Config, Object &Obj,

Obj.removeSections(RemovePred);

if (!Config.SectionsToRename.empty()) {
for (auto &Sec : Obj.sections()) {
const auto Iter = Config.SectionsToRename.find(Sec.Name);
if (Iter != Config.SectionsToRename.end())
Sec.Name = Iter->second;
}
}

if (!Config.AddSection.empty()) {
for (const auto &Flag : Config.AddSection) {
auto SecPair = Flag.split("=");
Expand Down Expand Up @@ -587,6 +596,14 @@ static CopyConfig ParseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
error("Multiple redefinition of symbol " + Old2New.first);
}

for (auto Arg : InputArgs.filtered(OBJCOPY_rename_section)) {
if (!StringRef(Arg->getValue()).contains('='))
error("Bad format for --rename-section");
auto Old2New = StringRef(Arg->getValue()).split('=');
if (!Config.SectionsToRename.insert(Old2New).second)
error("Already have a section rename for " + Old2New.first);
}

for (auto Arg : InputArgs.filtered(OBJCOPY_remove_section))
Config.ToRemove.push_back(Arg->getValue());
for (auto Arg : InputArgs.filtered(OBJCOPY_keep))
Expand Down

0 comments on commit 29f8275

Please sign in to comment.