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;
diff --git a/lib/ExecutionEngine/ELFObjectLoaderImpl.h b/lib/ExecutionEngine/ELFObjectLoaderImpl.h
index 37766fb..bc96eb4 100644
--- a/lib/ExecutionEngine/ELFObjectLoaderImpl.h
+++ b/lib/ExecutionEngine/ELFObjectLoaderImpl.h
@@ -45,6 +45,10 @@
virtual void *getSymbolAddress(const char *pName) const;
+ virtual size_t getSymbolSize(const char *pName) const;
+
+ virtual bool getSymbolNameList(android::Vector<const char *>& pNameList,
+ ObjectLoader::SymbolType pType) const;
~ELFObjectLoaderImpl();
};
diff --git a/lib/ExecutionEngine/ObjectLoader.cpp b/lib/ExecutionEngine/ObjectLoader.cpp
index 8ec3dd2..ade11ab 100644
--- a/lib/ExecutionEngine/ObjectLoader.cpp
+++ b/lib/ExecutionEngine/ObjectLoader.cpp
@@ -152,6 +152,15 @@
return mImpl->getSymbolAddress(pName);
}
+size_t ObjectLoader::getSymbolSize(const char *pName) const {
+ return mImpl->getSymbolSize(pName);
+}
+
+bool ObjectLoader::getSymbolNameList(android::Vector<const char *>& pNameList,
+ SymbolType pType) const {
+ return mImpl->getSymbolNameList(pNameList, pType);
+}
+
ObjectLoader::~ObjectLoader() {
delete mImpl;
delete [] reinterpret_cast<uint8_t *>(mDebugImage);
diff --git a/lib/ExecutionEngine/ObjectLoaderImpl.h b/lib/ExecutionEngine/ObjectLoaderImpl.h
index 0e0f2c1..a9de913 100644
--- a/lib/ExecutionEngine/ObjectLoaderImpl.h
+++ b/lib/ExecutionEngine/ObjectLoaderImpl.h
@@ -19,6 +19,11 @@
#include <cstring>
+#include "bcc/ExecutionEngine/ObjectLoader.h"
+#include "bcc/Support/Log.h"
+
+#include <utils/Vector.h>
+
namespace bcc {
class SymbolResolverInterface;
@@ -35,6 +40,11 @@
virtual void *getSymbolAddress(const char *pName) const = 0;
+ virtual size_t getSymbolSize(const char *pName) const = 0;
+
+ virtual bool getSymbolNameList(android::Vector<const char *>& pNameList,
+ ObjectLoader::SymbolType pType) const = 0;
+
virtual ~ObjectLoaderImpl() { }
};