diff --git a/lib/ExecutionEngine/Compiler.cpp b/lib/ExecutionEngine/Compiler.cpp
index 9d13039..f2f5f63 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -677,6 +677,7 @@
 
   if (ExportVarMetadata) {
     ScriptCompiled::ExportVarList &varList = mpResult->mExportVars;
+    std::vector<std::string> &varNameList = mpResult->mExportVarsName;
 
     for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) {
       llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i);
@@ -689,6 +690,7 @@
           varList.push_back(
             rsloaderGetSymbolAddress(mRSExecutable,
                                      ExportVarName.str().c_str()));
+          varNameList.push_back(ExportVarName.str());
 #if DEBUG_MCJIT_REFLECT
           LOGD("runMCCodeGen(): Exported Var: %s @ %p\n", ExportVarName.str().c_str(),
                varList.back());
@@ -703,6 +705,7 @@
 
   if (ExportFuncMetadata) {
     ScriptCompiled::ExportFuncList &funcList = mpResult->mExportFuncs;
+    std::vector<std::string> &funcNameList = mpResult->mExportFuncsName;
 
     for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) {
       llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i);
@@ -715,6 +718,7 @@
           funcList.push_back(
             rsloaderGetSymbolAddress(mRSExecutable,
                                      ExportFuncName.str().c_str()));
+          funcNameList.push_back(ExportFuncName.str());
 #if DEBUG_MCJIT_RELECT
           LOGD("runMCCodeGen(): Exported Func: %s @ %p\n", ExportFuncName.str().c_str(),
                funcList.back());
diff --git a/lib/ExecutionEngine/MCCacheReader.cpp b/lib/ExecutionEngine/MCCacheReader.cpp
index b017ffd..8c70e39 100644
--- a/lib/ExecutionEngine/MCCacheReader.cpp
+++ b/lib/ExecutionEngine/MCCacheReader.cpp
@@ -48,6 +48,8 @@
   if (mpHeader) { free(mpHeader); }
   if (mpCachedDependTable) { free(mpCachedDependTable); }
   if (mpPragmaList) { free(mpPragmaList); }
+  if (mpVarNameList) { free(mpVarNameList); }
+  if (mpFuncNameList) { free(mpFuncNameList); }
 }
 
 ScriptCached *MCCacheReader::readCacheFile(FileHandle *objFile,
@@ -83,7 +85,9 @@
              && readPragmaList()
              && readObjectSlotList()
              && readObjFile()
-             && relocate()
+             && readVarNameList()
+             && readFuncNameList()
+             //&& relocate()
              ;
 
   return result ? mpResult.take() : NULL;
@@ -333,6 +337,20 @@
   return true;
 }
 
+bool MCCacheReader::readVarNameList() {
+  CACHE_READER_READ_SECTION(OBCC_String_Ptr, mpVarNameList, export_var_name_list);
+  vector<char const *> const &strPool = mpResult->mStringPool;
+
+  for (size_t i = 0; i < export_var_name_list_raw->count; ++i) {
+    mpResult->mpExportVars->cached_addr_list[i] =
+      rsloaderGetSymbolAddress(mpResult->mRSExecutable, strPool[export_var_name_list_raw->strp_indexs[i]]);
+#if DEBUG_MCJIT_REFLECT
+    LOGD("Get symbol address: %s -> %p",
+      strPool[export_var_name_list_raw->strp_indexs[i]], mpResult->mpExportVars->cached_addr_list[i]);
+#endif
+  }
+  return true;
+}
 
 bool MCCacheReader::readExportFuncList() {
   CACHE_READER_READ_SECTION(OBCC_ExportFuncList,
@@ -341,6 +359,21 @@
 }
 
 
+bool MCCacheReader::readFuncNameList() {
+  CACHE_READER_READ_SECTION(OBCC_String_Ptr, mpFuncNameList, export_func_name_list);
+  vector<char const *> const &strPool = mpResult->mStringPool;
+
+  for (size_t i = 0; i < export_func_name_list_raw->count; ++i) {
+    mpResult->mpExportFuncs->cached_addr_list[i] =
+      rsloaderGetSymbolAddress(mpResult->mRSExecutable, strPool[export_func_name_list_raw->strp_indexs[i]]);
+#if DEBUG_MCJIT_REFLECT
+    LOGD("Get function address: %s -> %p",
+      strPool[export_func_name_list_raw->strp_indexs[i]], mpResult->mpExportFuncs->cached_addr_list[i]);
+#endif
+  }
+  return true;
+}
+
 bool MCCacheReader::readPragmaList() {
   CACHE_READER_READ_SECTION(OBCC_PragmaList, mpPragmaList, pragma_list);
 
@@ -409,24 +442,6 @@
 
 
 bool MCCacheReader::relocate() {
-  void *rootPtr = rsloaderGetSymbolAddress(mpResult->mRSExecutable, "root");
-  int mRootOffset = reinterpret_cast<char *>(rootPtr) -
-                    reinterpret_cast<char *>(mpHeader->root_base_addr);
-  for (size_t i = 0; i < mpResult->getExportVarCount(); ++i) {
-    // Variable is optimized out by libbcc. Don't relocate.
-    if (mpResult->mpExportVars->cached_addr_list[i] == 0x00) continue;
-
-    mpResult->mpExportVars->cached_addr_list[i] =
-    reinterpret_cast<void *>(
-        reinterpret_cast<char *>(mpResult->mpExportVars->cached_addr_list[i])
-        + mRootOffset);
-  }
-  for (size_t i = 0; i < mpResult->getExportFuncCount(); ++i) {
-    mpResult->mpExportFuncs->cached_addr_list[i] =
-    reinterpret_cast<void *>(
-        reinterpret_cast<char *>(mpResult->mpExportFuncs->cached_addr_list[i])
-        + mRootOffset);
-  }
   return true;
 }
 
diff --git a/lib/ExecutionEngine/MCCacheReader.h b/lib/ExecutionEngine/MCCacheReader.h
index e826b36..5077289 100644
--- a/lib/ExecutionEngine/MCCacheReader.h
+++ b/lib/ExecutionEngine/MCCacheReader.h
@@ -44,6 +44,9 @@
     OBCC_PragmaList *mpPragmaList;
     OBCC_FuncTable *mpFuncTable;
 
+    OBCC_String_Ptr *mpVarNameList;
+    OBCC_String_Ptr *mpFuncNameList;
+
     llvm::OwningPtr<ScriptCached> mpResult;
 
     std::map<std::string,
@@ -58,6 +61,7 @@
     MCCacheReader()
       : mObjFile(NULL), mInfoFile(NULL), mInfoFileSize(0), mpHeader(NULL),
         mpCachedDependTable(NULL), mpPragmaList(NULL),
+        mpVarNameList(NULL), mpFuncNameList(NULL),
         mIsContextSlotNotAvail(false) {
     }
 
@@ -92,6 +96,9 @@
     bool readObjFile();
     bool readRelocationTable();
 
+    bool readVarNameList();
+    bool readFuncNameList();
+
     bool checkFileSize();
     bool checkHeader();
     bool checkMachineIntType();
diff --git a/lib/ExecutionEngine/MCCacheWriter.cpp b/lib/ExecutionEngine/MCCacheWriter.cpp
index 1250ab7..10f8237 100644
--- a/lib/ExecutionEngine/MCCacheWriter.cpp
+++ b/lib/ExecutionEngine/MCCacheWriter.cpp
@@ -45,6 +45,8 @@
   CHECK_AND_FREE(mpExportFuncListSection);
   CHECK_AND_FREE(mpPragmaListSection);
   CHECK_AND_FREE(mpObjectSlotSection);
+  CHECK_AND_FREE(mpExportVarNameListSection);
+  CHECK_AND_FREE(mpExportFuncNameListSection);
 
 #undef CHECK_AND_FREE
 }
@@ -62,6 +64,8 @@
   bool result = prepareHeader(libRS_threadable)
              && prepareDependencyTable()
              && preparePragmaList()
+             && prepareExportVarNameList()
+             && prepareExportFuncNameList()
              && prepareStringPool()
              && prepareExportVarList()
              && prepareExportFuncList()
@@ -240,6 +244,30 @@
 }
 
 
+bool MCCacheWriter::prepareExportVarNameList() {
+  size_t varCount = mpOwner->getExportVarCount();
+  size_t listSize = sizeof(OBCC_String_Ptr) + sizeof(size_t) * varCount;
+
+  OBCC_String_Ptr *list = (OBCC_String_Ptr*)malloc(listSize);
+
+  if (!list) {
+    LOGE("Unable to allocate for export variable name list\n");
+    return false;
+  }
+
+  mpExportVarNameListSection = list;
+  mpHeaderSection->export_var_name_list_size = listSize;
+
+  list->count = static_cast<size_t>(varCount);
+
+  mpOwner->getExportVarNameList(varNameList);
+  for (size_t i = 0; i < varCount; ++i) {
+    list->strp_indexs[i] = addString(varNameList[i].c_str(), varNameList[i].length());
+  }
+  return true;
+}
+
+
 bool MCCacheWriter::prepareExportFuncList() {
   size_t funcCount = mpOwner->getExportFuncCount();
   size_t listSize = sizeof(OBCC_ExportFuncList) + sizeof(void *) * funcCount;
@@ -261,6 +289,30 @@
 }
 
 
+bool MCCacheWriter::prepareExportFuncNameList() {
+  size_t funcCount = mpOwner->getExportFuncCount();
+  size_t listSize = sizeof(OBCC_String_Ptr) + sizeof(size_t) * funcCount;
+
+  OBCC_String_Ptr *list = (OBCC_String_Ptr*)malloc(listSize);
+
+  if (!list) {
+    LOGE("Unable to allocate for export function name list\n");
+    return false;
+  }
+
+  mpExportFuncNameListSection = list;
+  mpHeaderSection->export_func_name_list_size = listSize;
+
+  list->count = static_cast<size_t>(funcCount);
+
+  mpOwner->getExportFuncNameList(funcNameList);
+  for (size_t i = 0; i < funcCount; ++i) {
+    list->strp_indexs[i] = addString(funcNameList[i].c_str(), funcNameList[i].length());
+  }
+  return true;
+}
+
+
 bool MCCacheWriter::prepareObjectSlotList() {
   size_t objectSlotCount = mpOwner->getObjectSlotCount();
 
@@ -307,6 +359,8 @@
   OFFSET_INCREASE(pragma_list);
   OFFSET_INCREASE(func_table);
   OFFSET_INCREASE(object_slot_list);
+  OFFSET_INCREASE(export_var_name_list);
+  OFFSET_INCREASE(export_func_name_list);
 
 #undef OFFSET_INCREASE
 
@@ -344,6 +398,9 @@
   WRITE_SECTION_SIMPLE(pragma_list, mpPragmaListSection);
   WRITE_SECTION_SIMPLE(object_slot_list, mpObjectSlotSection);
 
+  WRITE_SECTION_SIMPLE(export_var_name_list, mpExportVarNameListSection);
+  WRITE_SECTION_SIMPLE(export_func_name_list, mpExportFuncNameListSection);
+
 #undef WRITE_SECTION_SIMPLE
 #undef WRITE_SECTION
 
diff --git a/lib/ExecutionEngine/MCCacheWriter.h b/lib/ExecutionEngine/MCCacheWriter.h
index 962ef06..eb134cf 100644
--- a/lib/ExecutionEngine/MCCacheWriter.h
+++ b/lib/ExecutionEngine/MCCacheWriter.h
@@ -48,6 +48,12 @@
     OBCC_PragmaList *mpPragmaListSection;
     OBCC_ObjectSlotList *mpObjectSlotSection;
 
+    OBCC_String_Ptr *mpExportVarNameListSection;
+    OBCC_String_Ptr *mpExportFuncNameListSection;
+
+    std::vector<std::string> varNameList;
+    std::vector<std::string> funcNameList;
+
   public:
     MCCacheWriter()
       : mpHeaderSection(NULL), mpStringPoolSection(NULL),
@@ -78,6 +84,9 @@
     bool preparePragmaList();
     bool prepareObjectSlotList();
 
+    bool prepareExportVarNameList();
+    bool prepareExportFuncNameList();
+
     bool writeAll();
 
     bool calcSectionOffset();
diff --git a/lib/ExecutionEngine/Script.cpp b/lib/ExecutionEngine/Script.cpp
index a2039e5..290cede 100644
--- a/lib/ExecutionEngine/Script.cpp
+++ b/lib/ExecutionEngine/Script.cpp
@@ -603,6 +603,18 @@
   }
 }
 
+void Script::getExportVarNameList(std::vector<std::string> &varList) {
+  switch (mStatus) {
+    case ScriptStatus::Compiled: {
+      return mCompiled->getExportVarNameList(varList);
+    }
+
+    default: {
+      mErrorCode = BCC_INVALID_OPERATION;
+    }
+  }
+}
+
 
 void Script::getExportFuncList(size_t funcListSize, void **funcList) {
   switch (mStatus) {
@@ -624,6 +636,18 @@
   }
 }
 
+void Script::getExportFuncNameList(std::vector<std::string> &funcList) {
+  switch (mStatus) {
+    case ScriptStatus::Compiled: {
+      return mCompiled->getExportFuncNameList(funcList);
+    }
+
+    default: {
+      mErrorCode = BCC_INVALID_OPERATION;
+    }
+  }
+}
+
 
 void Script::getPragmaList(size_t pragmaListSize,
                            char const **keyList,
diff --git a/lib/ExecutionEngine/Script.h b/lib/ExecutionEngine/Script.h
index 97747b9..12cfd85 100644
--- a/lib/ExecutionEngine/Script.h
+++ b/lib/ExecutionEngine/Script.h
@@ -117,6 +117,10 @@
 
     void getExportFuncList(size_t size, void **list);
 
+    void getExportVarNameList(std::vector<std::string> &list);
+
+    void getExportFuncNameList(std::vector<std::string> &list);
+
     void getPragmaList(size_t size,
                        char const **keyList,
                        char const **valueList);
diff --git a/lib/ExecutionEngine/ScriptCompiled.cpp b/lib/ExecutionEngine/ScriptCompiled.cpp
index 189f94a..f5ea2e0 100644
--- a/lib/ExecutionEngine/ScriptCompiled.cpp
+++ b/lib/ExecutionEngine/ScriptCompiled.cpp
@@ -53,6 +53,15 @@
   }
 }
 
+void ScriptCompiled::getExportVarNameList(std::vector<std::string> &varList) {
+  varList = mExportVarsName;
+}
+
+
+void ScriptCompiled::getExportFuncNameList(std::vector<std::string> &funcList) {
+  funcList = mExportFuncsName;
+}
+
 
 void ScriptCompiled::getExportFuncList(size_t funcListSize, void **funcList) {
   if (funcList) {
diff --git a/lib/ExecutionEngine/ScriptCompiled.h b/lib/ExecutionEngine/ScriptCompiled.h
index 66efe3a..21b4056 100644
--- a/lib/ExecutionEngine/ScriptCompiled.h
+++ b/lib/ExecutionEngine/ScriptCompiled.h
@@ -51,6 +51,10 @@
     Compiler mCompiler;
 
     ExportVarList mExportVars;
+
+    std::vector<std::string> mExportVarsName;
+    std::vector<std::string> mExportFuncsName;
+
     ExportFuncList mExportFuncs;
     PragmaList mPragmas;
     ObjectSlotList mObjectSlots;
@@ -118,6 +122,10 @@
 
     void getExportFuncList(size_t funcListSize, void **funcList);
 
+    void getExportVarNameList(std::vector<std::string> &varList);
+
+    void getExportFuncNameList(std::vector<std::string> &funcList);
+
     void getPragmaList(size_t pragmaListSize,
                        char const **keyList,
                        char const **valueList);
