diff options
author | Armando Montanez <amontanez@google.com> | 2019-01-18 20:56:03 +0000 |
---|---|---|
committer | Armando Montanez <amontanez@google.com> | 2019-01-18 20:56:03 +0000 |
commit | 56d18121e2e45d711e171356d53371b3a868ec7c (patch) | |
tree | c8eb86bb2068e0054fb38672d47a271837556691 /llvm/tools | |
parent | 215c4f68f6a9930e76ad9051e640255757f2aacb (diff) | |
download | llvm-56d18121e2e45d711e171356d53371b3a868ec7c.zip llvm-56d18121e2e45d711e171356d53371b3a868ec7c.tar.gz llvm-56d18121e2e45d711e171356d53371b3a868ec7c.tar.bz2 |
[elfabi] Add support for reading DT_NEEDED from binaries
This patch gives elfabi the ability to read DT_NEEDED entries from ELF binaries
to populate NeededLibs in TextAPI's ELFStub.
Differential Revision: https://reviews.llvm.org/D55852
llvm-svn: 351592
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-elfabi/ELFObjHandler.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/llvm/tools/llvm-elfabi/ELFObjHandler.cpp b/llvm/tools/llvm-elfabi/ELFObjHandler.cpp index 4c8e61d..d60bd5c 100644 --- a/llvm/tools/llvm-elfabi/ELFObjHandler.cpp +++ b/llvm/tools/llvm-elfabi/ELFObjHandler.cpp @@ -31,6 +31,7 @@ struct DynamicEntries { uint64_t StrTabAddr = 0; uint64_t StrSize = 0; Optional<uint64_t> SONameOffset; + std::vector<uint64_t> NeededLibNames; }; /// This function behaves similarly to StringRef::substr(), but attempts to @@ -94,6 +95,9 @@ static Error populateDynamic(DynamicEntries &Dyn, Dyn.StrSize = Entry.d_un.d_val; FoundDynStrSz = true; break; + case DT_NEEDED: + Dyn.NeededLibNames.push_back(Entry.d_un.d_val); + break; } } @@ -111,6 +115,14 @@ static Error populateDynamic(DynamicEntries &Dyn, "DT_SONAME string offset (0x%016x) outside of dynamic string table", *Dyn.SONameOffset); } + for (uint64_t Offset : Dyn.NeededLibNames) { + if (Offset >= Dyn.StrSize) { + return createStringError( + object_error::parse_failed, + "DT_NEEDED string offset (0x%016x) outside of dynamic string table", + Offset); + } + } return Error::success(); } @@ -164,7 +176,16 @@ buildStub(const ELFObjectFile<ELFT> &ElfObj) { DestStub->SoName = *NameOrErr; } - // TODO: Populate NeededLibs from .dynamic entries and linked string table. + // Populate NeededLibs from .dynamic entries and dynamic string table. + for (uint64_t NeededStrOffset : DynEnt.NeededLibNames) { + Expected<StringRef> LibNameOrErr = + terminatedSubstr(DynStr, NeededStrOffset); + if (!LibNameOrErr) { + return appendToError(LibNameOrErr.takeError(), "when reading DT_NEEDED"); + } + DestStub->NeededLibs.push_back(*LibNameOrErr); + } + // TODO: Populate Symbols from .dynsym table and linked string table. return std::move(DestStub); |