]> git.siccegge.de Git - frida/frida.git/blobdiff - src/disassembler/llvm/LLVMDisassembler.cxx
Add dynamically linked symbols
[frida/frida.git] / src / disassembler / llvm / LLVMDisassembler.cxx
index 18cfe8065eefc0fb5e409d7978408e50dd47a1b2..5652cfb8bb2e62f6bb04813606aa82397861f65d 100644 (file)
@@ -156,6 +156,7 @@ void LLVMDisassembler<ELFT>::start() {
        readSymbols();
        readSections();
        disassemble();
+       readDynamicSymbols();
 }
 
 template <typename ELFT>
@@ -320,7 +321,6 @@ void LLVMDisassembler<ELFT>::disassemble() {
        }
 
        if (binary->isELF()) {
-               typedef ELFFile<ELFT> ELFO;
                const ELFO * elffile = o->getELFFile();
                const typename ELFO::Elf_Ehdr * header = elffile->getHeader();
 
@@ -389,6 +389,25 @@ void LLVMDisassembler<ELFT>::splitBlocks(LLVMFunction* function) {
        }
 }
 
+template <typename ELFT>
+void LLVMDisassembler<ELFT>::readDynamicSymbols() {
+       const ELFO * elffile = o->getELFFile();
+       for (typename ELFO::Elf_Sym_Iter
+                    it = elffile->begin_dynamic_symbols(),
+                    end = elffile->end_dynamic_symbols();
+            it != end;
+            ++it) {
+               if (it->getType() == 2) { // Function
+                       bool is_default;
+                       // TODO: Error handling
+                       std::string symbolname = *(elffile->getSymbolName(it));
+                       std::string symbolversion = *(elffile->getSymbolVersion(nullptr, &*it, is_default));
+                       manager->signal_new_dyn_symbol(symbolname + (is_default? "@@" : "@") + symbolversion);
+                       LOG4CXX_DEBUG(logger, "Adding dynamic Symbol " << symbolname << (is_default? "@@" : "@") << symbolversion);
+               }
+       }
+}
+
 template <typename ELFT>
 void LLVMDisassembler<ELFT>::readSymbols() {
        error_code ec;