4 #include "SymbolParser.h"
6 #include "Initializer.h"
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()) {
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");
27 symbol_table
->read_content();
28 /*Block *address_table = elf_parser->get_section(".rela.plt")->get_content();
29 while(address_table->get_size()) {
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;
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()) {
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;
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());
61 std::cout
<< std::dec
;
64 SymbolParser::~SymbolParser() {
67 Symbol
*SymbolParser::get_symbol(std::string name
) const {
68 StorageManager
*storage_manager
= Initializer::get_instance()->get_storage_manager();
69 for(symbol_vector_t::const_iterator i
= symbol_vector
.begin(); i
!= symbol_vector
.end(); i
++) {
70 if(storage_manager
->get_symbol(*i
)->get_symbol_name() == name
) return storage_manager
->get_symbol(*i
);
75 void SymbolParser::dump_symbols() const {
76 std::cout
<< "Symbol dump: \n";
77 for(symbol_vector_t::const_iterator i
= symbol_vector
.begin(); i
!= symbol_vector
.end(); i
++) {
78 /*std::cout << "\tSymbol: name is \"" << (*i)->get_symbol_name() << "\", address is 0x" << std::hex << (*i)->get_address() << std::dec << std::endl;*/