aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools
diff options
context:
space:
mode:
authorArmando Montanez <amontanez@google.com>2019-01-18 20:56:03 +0000
committerArmando Montanez <amontanez@google.com>2019-01-18 20:56:03 +0000
commit56d18121e2e45d711e171356d53371b3a868ec7c (patch)
treec8eb86bb2068e0054fb38672d47a271837556691 /llvm/tools
parent215c4f68f6a9930e76ad9051e640255757f2aacb (diff)
downloadllvm-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.cpp23
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);