@@ -36,10 +36,18 @@ bool utils::elf::isELF(StringRef Buffer) {
36
36
}
37
37
}
38
38
39
- template <class ELFT >
40
- static Expected<bool >
41
- checkMachineImpl (const object::ELFObjectFile<ELFT> &ELFObj, uint16_t EMachine) {
42
- const auto Header = ELFObj.getELFFile ().getHeader ();
39
+ Expected<bool > utils::elf::checkMachine (StringRef Object, uint16_t EMachine) {
40
+ assert (isELF (Object) && " Input is not an ELF!" );
41
+
42
+ Expected<ELF64LEObjectFile> ElfOrErr =
43
+ ELF64LEObjectFile::create (MemoryBufferRef (Object, /* Identifier=*/ " " ),
44
+ /* InitContent=*/ false );
45
+ if (!ElfOrErr)
46
+ return ElfOrErr.takeError ();
47
+
48
+ const auto Header = ElfOrErr->getELFFile ().getHeader ();
49
+ if (Header.e_ident [EI_CLASS] != ELFCLASS64)
50
+ return createError (" Only 64-bit ELF files are supported" );
43
51
if (Header.e_type != ET_EXEC && Header.e_type != ET_DYN)
44
52
return createError (" Only executable ELF files are supported" );
45
53
@@ -63,25 +71,6 @@ checkMachineImpl(const object::ELFObjectFile<ELFT> &ELFObj, uint16_t EMachine) {
63
71
return Header.e_machine == EMachine;
64
72
}
65
73
66
- Expected<bool > utils::elf::checkMachine (StringRef Object, uint16_t EMachine) {
67
- assert (isELF (Object) && " Input is not an ELF!" );
68
-
69
- Expected<std::unique_ptr<ObjectFile>> ElfOrErr =
70
- ObjectFile::createELFObjectFile (
71
- MemoryBufferRef (Object, /* Identifier=*/ " " ),
72
- /* InitContent=*/ false );
73
- if (!ElfOrErr)
74
- return ElfOrErr.takeError ();
75
-
76
- if (const ELF64LEObjectFile *ELFObj =
77
- dyn_cast<ELF64LEObjectFile>(&**ElfOrErr))
78
- return checkMachineImpl (*ELFObj, EMachine);
79
- if (const ELF64BEObjectFile *ELFObj =
80
- dyn_cast<ELF64BEObjectFile>(&**ElfOrErr))
81
- return checkMachineImpl (*ELFObj, EMachine);
82
- return createError (" Only 64-bit ELF files are supported" );
83
- }
84
-
85
74
template <class ELFT >
86
75
static Expected<const typename ELFT::Sym *>
87
76
getSymbolFromGnuHashTable (StringRef Name, const typename ELFT::GnuHash &HashTab,
@@ -149,10 +138,9 @@ getSymbolFromSysVHashTable(StringRef Name, const typename ELFT::Hash &HashTab,
149
138
}
150
139
151
140
template <class ELFT >
152
- static Expected<std::optional<ELFSymbolRef>>
153
- getHashTableSymbol (const ELFObjectFile<ELFT> &ELFObj,
154
- const typename ELFT::Shdr &Sec, StringRef Name) {
155
- const ELFFile<ELFT> &Elf = ELFObj.getELFFile ();
141
+ static Expected<const typename ELFT::Sym *>
142
+ getHashTableSymbol (const ELFFile<ELFT> &Elf, const typename ELFT::Shdr &Sec,
143
+ StringRef Name) {
156
144
if (Sec.sh_type != ELF::SHT_HASH && Sec.sh_type != ELF::SHT_GNU_HASH)
157
145
return createError (
158
146
" invalid sh_type for hash table, expected SHT_HASH or SHT_GNU_HASH" );
@@ -191,10 +179,7 @@ getHashTableSymbol(const ELFObjectFile<ELFT> &ELFObj,
191
179
sizeof (typename ELFT::Word) * HashTab->nbuckets +
192
180
sizeof (typename ELFT::Word) * (SymTab.size () - HashTab->symndx ))
193
181
return createError (" section has invalid sh_size: " + Twine (Sec.sh_size ));
194
- auto Sym = getSymbolFromGnuHashTable<ELFT>(Name, *HashTab, SymTab, StrTab);
195
- if (!Sym)
196
- return Sym.takeError ();
197
- return ELFObj.toSymbolRef (*SymTabOrErr, *Sym - &SymTab[0 ]);
182
+ return getSymbolFromGnuHashTable<ELFT>(Name, *HashTab, SymTab, StrTab);
198
183
}
199
184
200
185
// If this is a Sys-V hash table we verify its size and search the symbol
@@ -212,20 +197,16 @@ getHashTableSymbol(const ELFObjectFile<ELFT> &ELFObj,
212
197
sizeof (typename ELFT::Word) * HashTab->nchain )
213
198
return createError (" section has invalid sh_size: " + Twine (Sec.sh_size ));
214
199
215
- auto Sym = getSymbolFromSysVHashTable<ELFT>(Name, *HashTab, SymTab, StrTab);
216
- if (!Sym)
217
- return Sym.takeError ();
218
- return ELFObj.toSymbolRef (*SymTabOrErr, *Sym - &SymTab[0 ]);
200
+ return getSymbolFromSysVHashTable<ELFT>(Name, *HashTab, SymTab, StrTab);
219
201
}
220
202
221
- return std::nullopt ;
203
+ return nullptr ;
222
204
}
223
205
224
206
template <class ELFT >
225
- static Expected<std::optional<ELFSymbolRef>>
226
- getSymTableSymbol (const ELFObjectFile<ELFT> &ELFObj,
227
- const typename ELFT::Shdr &Sec, StringRef Name) {
228
- const ELFFile<ELFT> &Elf = ELFObj.getELFFile ();
207
+ static Expected<const typename ELFT::Sym *>
208
+ getSymTableSymbol (const ELFFile<ELFT> &Elf, const typename ELFT::Shdr &Sec,
209
+ StringRef Name) {
229
210
if (Sec.sh_type != ELF::SHT_SYMTAB && Sec.sh_type != ELF::SHT_DYNSYM)
230
211
return createError (
231
212
" invalid sh_type for hash table, expected SHT_SYMTAB or SHT_DYNSYM" );
@@ -245,14 +226,13 @@ getSymTableSymbol(const ELFObjectFile<ELFT> &ELFObj,
245
226
246
227
for (const typename ELFT::Sym &Sym : SymTab)
247
228
if (StrTab.drop_front (Sym.st_name ).data () == Name)
248
- return ELFObj. toSymbolRef (&Sec, & Sym - &SymTab[ 0 ]) ;
229
+ return & Sym;
249
230
250
- return std::nullopt ;
231
+ return nullptr ;
251
232
}
252
233
253
- template <class ELFT >
254
- static Expected<std::optional<ELFSymbolRef>>
255
- getSymbolImpl (const ELFObjectFile<ELFT> &ELFObj, StringRef Name) {
234
+ Expected<const typename ELF64LE::Sym *>
235
+ utils::elf::getSymbol (const ELFObjectFile<ELF64LE> &ELFObj, StringRef Name) {
256
236
// First try to look up the symbol via the hash table.
257
237
for (ELFSectionRef Sec : ELFObj.sections ()) {
258
238
if (Sec.getType () != SHT_HASH && Sec.getType () != SHT_GNU_HASH)
@@ -261,7 +241,8 @@ getSymbolImpl(const ELFObjectFile<ELFT> &ELFObj, StringRef Name) {
261
241
auto HashTabOrErr = ELFObj.getELFFile ().getSection (Sec.getIndex ());
262
242
if (!HashTabOrErr)
263
243
return HashTabOrErr.takeError ();
264
- return getHashTableSymbol<ELFT>(ELFObj, **HashTabOrErr, Name);
244
+ return getHashTableSymbol<ELF64LE>(ELFObj.getELFFile (), **HashTabOrErr,
245
+ Name);
265
246
}
266
247
267
248
// If this is an executable file check the entire standard symbol table.
@@ -272,31 +253,16 @@ getSymbolImpl(const ELFObjectFile<ELFT> &ELFObj, StringRef Name) {
272
253
auto SymTabOrErr = ELFObj.getELFFile ().getSection (Sec.getIndex ());
273
254
if (!SymTabOrErr)
274
255
return SymTabOrErr.takeError ();
275
- return getSymTableSymbol<ELFT >(ELFObj, **SymTabOrErr, Name);
256
+ return getSymTableSymbol<ELF64LE >(ELFObj. getELFFile () , **SymTabOrErr, Name);
276
257
}
277
258
278
- return std::nullopt;
279
- }
280
-
281
- Expected<std::optional<ELFSymbolRef>>
282
- utils::elf::getSymbol (const ObjectFile &Obj, StringRef Name) {
283
- if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(&Obj))
284
- return getSymbolImpl (*ELFObj, Name);
285
- if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(&Obj))
286
- return getSymbolImpl (*ELFObj, Name);
287
- return createError (" Only 64-bit ELF files are supported" );
259
+ return nullptr ;
288
260
}
289
261
290
- template <class ELFT >
291
- static Expected<const void *>
292
- getSymbolAddressImpl (const ELFObjectFile<ELFT> &ELFObj,
293
- const ELFSymbolRef &SymRef) {
294
- const ELFFile<ELFT> &ELFFile = ELFObj.getELFFile ();
295
-
296
- auto SymOrErr = ELFObj.getSymbol (SymRef.getRawDataRefImpl ());
297
- if (!SymOrErr)
298
- return SymOrErr.takeError ();
299
- const auto &Symbol = **SymOrErr;
262
+ Expected<const void *> utils::elf::getSymbolAddress (
263
+ const object::ELFObjectFile<object::ELF64LE> &ELFObj,
264
+ const object::ELF64LE::Sym &Symbol) {
265
+ const ELFFile<ELF64LE> &ELFFile = ELFObj.getELFFile ();
300
266
301
267
auto SecOrErr = ELFFile.getSection (Symbol.st_shndx );
302
268
if (!SecOrErr)
@@ -317,13 +283,3 @@ getSymbolAddressImpl(const ELFObjectFile<ELFT> &ELFObj,
317
283
318
284
return ELFFile.base () + Offset;
319
285
}
320
-
321
- Expected<const void *>
322
- utils::elf::getSymbolAddress (const ELFSymbolRef &SymRef) {
323
- const ObjectFile *Obj = SymRef.getObject ();
324
- if (const ELF64LEObjectFile *ELFObj = dyn_cast<ELF64LEObjectFile>(Obj))
325
- return getSymbolAddressImpl (*ELFObj, SymRef);
326
- if (const ELF64BEObjectFile *ELFObj = dyn_cast<ELF64BEObjectFile>(Obj))
327
- return getSymbolAddressImpl (*ELFObj, SymRef);
328
- return createError (" Only 64-bit ELF files are supported" );
329
- }
0 commit comments