Add APIs to get symbol size and symbol name list. BUG=6841435.
Change-Id: I4ed2af9fcfed1086f48830f9f041299fd037f436
diff --git a/lib/ExecutionEngine/ELFObjectLoaderImpl.cpp b/lib/ExecutionEngine/ELFObjectLoaderImpl.cpp
index 86e6efd..4525daa 100644
--- a/lib/ExecutionEngine/ELFObjectLoaderImpl.cpp
+++ b/lib/ExecutionEngine/ELFObjectLoaderImpl.cpp
@@ -104,7 +104,7 @@
return NULL;
}
- ELFSymbol<32> *symbol = mSymTab->getByName(pName);
+ const ELFSymbol<32> *symbol = mSymTab->getByName(pName);
if (symbol == NULL) {
ALOGV("Request symbol '%s' is not found in the object!", pName);
return NULL;
@@ -114,6 +114,62 @@
/* autoAlloc */false);
}
+size_t ELFObjectLoaderImpl::getSymbolSize(const char *pName) const {
+ if (mSymTab == NULL) {
+ return 0;
+ }
+
+ const ELFSymbol<32> *symbol = mSymTab->getByName(pName);
+
+ if (symbol == NULL) {
+ ALOGV("Request symbol '%s' is not found in the object!", pName);
+ return 0;
+ }
+
+ return static_cast<size_t>(symbol->getSize());
+
+}
+
+bool
+ELFObjectLoaderImpl::getSymbolNameList(android::Vector<const char *>& pNameList,
+ ObjectLoader::SymbolType pType) const {
+ if (mSymTab == NULL) {
+ return false;
+ }
+
+ unsigned elf_type;
+ switch (pType) {
+ case ObjectLoader::kFunctionType: {
+ elf_type = llvm::ELF::STT_FUNC;
+ break;
+ }
+ case ObjectLoader::kUnknownType: {
+ break;
+ }
+ default: {
+ assert(false && "Invalid symbol type given!");
+ return false;
+ }
+ }
+
+ for (size_t i = 0, e = mSymTab->size(); i != e; i++) {
+ ELFSymbol<32> *symbol = (*mSymTab)[i];
+ if (symbol == NULL) {
+ continue;
+ }
+
+ if ((pType == ObjectLoader::kUnknownType) ||
+ (symbol->getType() == elf_type)) {
+ const char *symbol_name = symbol->getName();
+ if (symbol_name != NULL) {
+ pNameList.push_back(symbol_name);
+ }
+ }
+ }
+
+ return true;
+}
+
ELFObjectLoaderImpl::~ELFObjectLoaderImpl() {
delete mObject;
return;