Skip to content

Commit c176f9b

Browse files
committed
Add functionality to llvm-objcopy to remove prefixes
llvm-objcopy has functionality to add prefixes to symbols (--prefix-symbols). This adds an inverse action to undo the modification and return to the original.
1 parent 4eeeeb3 commit c176f9b

File tree

6 files changed

+134
-0
lines changed

6 files changed

+134
-0
lines changed

llvm/include/llvm/ObjCopy/CommonConfig.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ struct CommonConfig {
218218
uint64_t PadTo = 0;
219219
StringRef SplitDWO;
220220
StringRef SymbolsPrefix;
221+
StringRef SymbolsPrefixRemove;
221222
StringRef AllocSectionsPrefix;
222223
DiscardType DiscardMode = DiscardType::None;
223224

llvm/lib/ObjCopy/ConfigManager.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ namespace objcopy {
1515

1616
Expected<const COFFConfig &> ConfigManager::getCOFFConfig() const {
1717
if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
18+
!Common.SymbolsPrefixRemove.empty() ||
1819
!Common.AllocSectionsPrefix.empty() || !Common.KeepSection.empty() ||
1920
!Common.SymbolsToGlobalize.empty() || !Common.SymbolsToKeep.empty() ||
2021
!Common.SymbolsToLocalize.empty() || !Common.SymbolsToWeaken.empty() ||
@@ -33,6 +34,7 @@ Expected<const COFFConfig &> ConfigManager::getCOFFConfig() const {
3334

3435
Expected<const MachOConfig &> ConfigManager::getMachOConfig() const {
3536
if (!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
37+
!Common.SymbolsPrefixRemove.empty() ||
3638
!Common.AllocSectionsPrefix.empty() || !Common.KeepSection.empty() ||
3739
!Common.SymbolsToGlobalize.empty() || !Common.SymbolsToKeep.empty() ||
3840
!Common.SymbolsToLocalize.empty() ||
@@ -54,6 +56,7 @@ Expected<const MachOConfig &> ConfigManager::getMachOConfig() const {
5456
Expected<const WasmConfig &> ConfigManager::getWasmConfig() const {
5557
if (!Common.AddGnuDebugLink.empty() || Common.ExtractPartition ||
5658
!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
59+
!Common.SymbolsPrefixRemove.empty() ||
5760
!Common.AllocSectionsPrefix.empty() ||
5861
Common.DiscardMode != DiscardType::None || !Common.SymbolsToAdd.empty() ||
5962
!Common.SymbolsToGlobalize.empty() || !Common.SymbolsToLocalize.empty() ||
@@ -74,6 +77,7 @@ Expected<const WasmConfig &> ConfigManager::getWasmConfig() const {
7477
Expected<const XCOFFConfig &> ConfigManager::getXCOFFConfig() const {
7578
if (!Common.AddGnuDebugLink.empty() || Common.ExtractPartition ||
7679
!Common.SplitDWO.empty() || !Common.SymbolsPrefix.empty() ||
80+
!Common.SymbolsPrefixRemove.empty() ||
7781
!Common.AllocSectionsPrefix.empty() ||
7882
Common.DiscardMode != DiscardType::None || !Common.AddSection.empty() ||
7983
!Common.DumpSection.empty() || !Common.SymbolsToAdd.empty() ||

llvm/lib/ObjCopy/ELF/ELFObjcopy.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,11 @@ static Error updateAndRemoveSymbols(const CommonConfig &Config,
329329
if (I != Config.SymbolsToRename.end())
330330
Sym.Name = std::string(I->getValue());
331331

332+
if (!Config.SymbolsPrefixRemove.empty() && Sym.Type != STT_SECTION)
333+
if (Sym.Name.compare(0, Config.SymbolsPrefixRemove.size(),
334+
Config.SymbolsPrefixRemove) == 0)
335+
Sym.Name = Sym.Name.substr(Config.SymbolsPrefixRemove.size());
336+
332337
if (!Config.SymbolsPrefix.empty() && Sym.Type != STT_SECTION)
333338
Sym.Name = (Config.SymbolsPrefix + Sym.Name).str();
334339
});
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
# RUN: yaml2obj %s -o %t
2+
# RUN: llvm-objcopy --remove-prefix-symbols __pf_ %t %t2
3+
# RUN: llvm-readobj --symbols %t2 | FileCheck %s
4+
5+
## Show that an empty string is permitted as the argument to
6+
## --remove-prefix-symbols.
7+
# RUN: llvm-objcopy --remove-prefix-symbols= %t2 %t3
8+
# RUN: cmp %t2 %t3
9+
10+
## When both options are present, llvm-objcopy should remove
11+
## prefixes first, before adding prefixes.
12+
# RUN: llvm-objcopy --prefix-symbols=AAA --remove-prefix-symbols=AAA %t %t4
13+
# RUN: llvm-objcopy --prefix-symbols=AAA %t %t5
14+
# RUN: cmp %t4 %t5
15+
16+
!ELF
17+
FileHeader:
18+
Class: ELFCLASS64
19+
Data: ELFDATA2LSB
20+
Type: ET_REL
21+
Machine: EM_X86_64
22+
Sections:
23+
- Name: .text
24+
Type: SHT_PROGBITS
25+
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
26+
Address: 0x1000
27+
AddressAlign: 0x0000000000000010
28+
Size: 64
29+
Symbols:
30+
- Name: __pf_foo
31+
Type: STT_SECTION
32+
Section: .text
33+
- Name: __pf_bar
34+
Type: STT_FILE
35+
Section: .text
36+
- Name: foobar
37+
Type: STT_FUNC
38+
Section: .text
39+
Binding: STB_GLOBAL
40+
- Name: foo__pf_bar1
41+
Type: STT_FUNC
42+
Section: .text
43+
Binding: STB_GLOBAL
44+
- Name: __pf_foo__pf_bar2
45+
Type: STT_FUNC
46+
Section: .text
47+
Binding: STB_GLOBAL
48+
- Name: undef
49+
Binding: STB_GLOBAL
50+
51+
# CHECK: Symbols [
52+
# CHECK-NEXT: Symbol {
53+
# CHECK-NEXT: Name:
54+
# CHECK-NEXT: Value: 0x0
55+
# CHECK-NEXT: Size: 0
56+
# CHECK-NEXT: Binding: Local
57+
# CHECK-NEXT: Type: None
58+
# CHECK-NEXT: Other: 0
59+
# CHECK-NEXT: Section: Undefined
60+
# CHECK-NEXT: }
61+
# CHECK-NEXT: Symbol {
62+
# CHECK-NEXT: Name: __pf_foo
63+
# CHECK-NEXT: Value: 0x0
64+
# CHECK-NEXT: Size: 0
65+
# CHECK-NEXT: Binding: Local
66+
# CHECK-NEXT: Type: Section
67+
# CHECK-NEXT: Other: 0
68+
# CHECK-NEXT: Section: .text
69+
# CHECK-NEXT: }
70+
# CHECK-NEXT: Symbol {
71+
# CHECK-NEXT: Name: bar
72+
# CHECK-NEXT: Value: 0x0
73+
# CHECK-NEXT: Size: 0
74+
# CHECK-NEXT: Binding: Local
75+
# CHECK-NEXT: Type: File
76+
# CHECK-NEXT: Other: 0
77+
# CHECK-NEXT: Section: .text
78+
# CHECK-NEXT: }
79+
# CHECK-NEXT: Symbol {
80+
# CHECK-NEXT: Name: foobar
81+
# CHECK-NEXT: Value: 0x0
82+
# CHECK-NEXT: Size: 0
83+
# CHECK-NEXT: Binding: Global
84+
# CHECK-NEXT: Type: Function
85+
# CHECK-NEXT: Other: 0
86+
# CHECK-NEXT: Section: .text
87+
# CHECK-NEXT: }
88+
# CHECK-NEXT: Symbol {
89+
# CHECK-NEXT: Name: foo__pf_bar1
90+
# CHECK-NEXT: Value: 0x0
91+
# CHECK-NEXT: Size: 0
92+
# CHECK-NEXT: Binding: Global
93+
# CHECK-NEXT: Type: Function
94+
# CHECK-NEXT: Other: 0
95+
# CHECK-NEXT: Section: .text
96+
# CHECK-NEXT: }
97+
# CHECK-NEXT: Symbol {
98+
# CHECK-NEXT: Name: foo__pf_bar2
99+
# CHECK-NEXT: Value: 0x0
100+
# CHECK-NEXT: Size: 0
101+
# CHECK-NEXT: Binding: Global
102+
# CHECK-NEXT: Type: Function
103+
# CHECK-NEXT: Other: 0
104+
# CHECK-NEXT: Section: .text
105+
# CHECK-NEXT: }
106+
# CHECK-NEXT: Symbol {
107+
# CHECK-NEXT: Name: undef
108+
# CHECK-NEXT: Value: 0x0
109+
# CHECK-NEXT: Size: 0
110+
# CHECK-NEXT: Binding: Global
111+
# CHECK-NEXT: Type: None
112+
# CHECK-NEXT: Other: 0
113+
# CHECK-NEXT: Section: Undefined
114+
# CHECK-NEXT: }
115+
# CHECK-NEXT:]

llvm/tools/llvm-objcopy/ObjcopyOptions.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,11 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr,
731731
llvm::crc32(arrayRefFromStringRef(Debug->getBuffer()));
732732
}
733733
Config.SplitDWO = InputArgs.getLastArgValue(OBJCOPY_split_dwo);
734+
734735
Config.SymbolsPrefix = InputArgs.getLastArgValue(OBJCOPY_prefix_symbols);
736+
Config.SymbolsPrefixRemove =
737+
InputArgs.getLastArgValue(OBJCOPY_remove_prefix_symbols);
738+
735739
Config.AllocSectionsPrefix =
736740
InputArgs.getLastArgValue(OBJCOPY_prefix_alloc_sections);
737741
if (auto Arg = InputArgs.getLastArg(OBJCOPY_extract_partition))

llvm/tools/llvm-objcopy/ObjcopyOpts.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,11 @@ defm dump_section
203203
defm prefix_symbols
204204
: Eq<"prefix-symbols", "Add <prefix> to the start of every symbol name">,
205205
MetaVarName<"prefix">;
206+
defm remove_prefix_symbols
207+
: Eq<"remove-prefix-symbols",
208+
"Remove <prefix> from the start of every symbol name. No-op for symbols that do not start "
209+
"with <prefix>">,
210+
MetaVarName<"prefix">;
206211

207212
defm prefix_alloc_sections
208213
: Eq<"prefix-alloc-sections", "Add <prefix> to the start of every allocated section name">,

0 commit comments

Comments
 (0)