Fixed several rather large memory leaks in the monitor.
[aesalon.git] / monitor / src / elf / SymbolParser.cpp
blobb9d4bf462764846ca7faf3573232f9ed929cf022
1 #include <iostream>
2 #include <cstring>
4 #include "SymbolParser.h"
5 #include "Parser.h"
6 #include "Initializer.h"
8 namespace ELF {
10 SymbolParser::SymbolParser(Parser *elf_parser) : elf_parser(elf_parser) {
11 StorageManager *storage_manager = Initializer::get_instance()->get_storage_manager();
12 std::cout << std::hex;
13 /* Start off with the static symbols . . . */
14 Section *symbol_table = elf_parser->get_section(".symtab");
15 if(symbol_table) { /* Only try to parse the symbols if the .symtab section exists */
16 Block *symbol_block = symbol_table->get_content();
17 while(symbol_block->get_size()) {
18 Elf64_Sym sym;
19 symbol_block->read(&sym, sizeof(sym));
21 char *name = (char *)(elf_parser->get_section(".strtab")->get_content()->get_data() + sym.st_name);
22 if(sym.st_value) symbol_vector.push_back(storage_manager->new_symbol(name, sym.st_value, sym.st_size)->get_storage_offset());
25 symbol_table = elf_parser->get_section(".rela.plt");
26 if(symbol_table) {
27 symbol_table->read_content();
28 /*Block *address_table = elf_parser->get_section(".rela.plt")->get_content();
29 while(address_table->get_size()) {
30 Elf64_Rela rela;
31 address_table->read(&rela, sizeof(rela));
32 Word symbol = ELF64_R_SYM(rela.r_info);
33 if(symbol > dynamic_offsets.size()) dynamic_offsets.resize(symbol * 2);
34 dynamic_offsets[symbol] = rela.r_offset;
35 std::cout << "Dynamic offset parsed:" << std::hex << std::endl;
36 std::cout << "\tsymbol: " << symbol << std::endl;
37 std::cout << "\tr_offset: " << rela.r_offset << std::endl;
38 std::cout << "\tr_addend: " << rela.r_addend << std::endl;
39 }*/
41 Block *symbol_block;
42 /* Now for the dynamic symbols. Otherwise known as the tricky ones. */
43 symbol_block = elf_parser->get_section(".dynsym")->get_content();
44 std::size_t index = 0;
45 while(symbol_block->get_size()) {
46 Elf64_Sym sym;
47 symbol_block->read(&sym, sizeof(sym));
49 char *name = (char *)&elf_parser->get_section(".dynstr")->get_content()->get_data()[sym.st_name];
50 /*if(!std::strcmp(name, "malloc")) {
51 std::cout << "malloc symbol:" << std::endl;
52 std::cout << "\tdynamic_offset is: " << dynamic_offsets[index] << std::endl;
53 std::cout << "\tvalue is " << sym.st_value << std::endl;
54 }*/
55 /*std::cout << "Dynamic symbol: name is \"" << name << "\", address is " << sym.st_value << std::endl;
56 std::cout << "Dynamic offset for this symbol is: " << dynamic_offsets[index] << std::endl;*/
57 if(sym.st_name) symbol_vector.push_back(storage_manager->new_symbol(name, sym.st_value/* + dynamic_offsets[index]*/, sym.st_size)->get_storage_offset());
58 index ++;
61 std::cout << std::dec;
64 SymbolParser::~SymbolParser() {
65 for(symbol_vector_t::iterator i = symbol_vector.begin(); i != symbol_vector.end(); i ++) {
66 Initializer::get_instance()->get_storage_manager()->get_symbol(*i)->~Symbol();
70 Symbol *SymbolParser::get_symbol(std::string name) const {
71 StorageManager *storage_manager = Initializer::get_instance()->get_storage_manager();
72 for(symbol_vector_t::const_iterator i = symbol_vector.begin(); i != symbol_vector.end(); i ++) {
73 if(storage_manager->get_symbol(*i)->get_symbol_name() == name) return storage_manager->get_symbol(*i);
75 return NULL;
78 void SymbolParser::dump_symbols() const {
79 std::cout << "Symbol dump: \n";
80 for(symbol_vector_t::const_iterator i = symbol_vector.begin(); i != symbol_vector.end(); i ++) {
81 /*std::cout << "\tSymbol: name is \"" << (*i)->get_symbol_name() << "\", address is 0x" << std::hex << (*i)->get_address() << std::dec << std::endl;*/
85 } // namespace ELF