@@ -61,6 +61,7 bool ElfFile::openFile(const QString &Fi | |||
|
61 | 61 | elf_getshdrstrndx (this->e, &this->shstrndx); |
|
62 | 62 | this->updateSegments(); |
|
63 | 63 | this->updateSections(); |
|
64 | this->updateSymbols(); | |
|
64 | 65 | this->opened = true; |
|
65 | 66 | return 1; |
|
66 | 67 | } |
@@ -751,13 +752,35 void ElfFile::updateSegments() | |||
|
751 | 752 | |
|
752 | 753 | void ElfFile::updateSymbols() |
|
753 | 754 | { |
|
755 | for(int i=0;i<symbols.count();i++) | |
|
756 | { | |
|
757 | delete this->symbols.at(i); | |
|
758 | } | |
|
759 | this->symbols.clear(); | |
|
760 | updateSections(); //Useless in most case but safer to do it | |
|
761 | for(int i=0;i<SectionCount;i++) | |
|
762 | { | |
|
763 | //First find Symbol table | |
|
764 | if(this->getSectionName(i)==".symtab") | |
|
765 | { | |
|
766 | Elf_Section* sec = sections.at(i); | |
|
767 | this->SymbolCount = sec->section_header->sh_size / sec->section_header->sh_entsize; | |
|
768 | //Then list all symbols | |
|
769 | for(int j=0;j<this->SymbolCount;j++) | |
|
770 | { | |
|
771 | GElf_Sym* esym = (GElf_Sym*)malloc(sizeof(GElf_Sym)); | |
|
772 | gelf_getsym(sec->data, j, esym); | |
|
773 | QString name = elf_strptr(this->e,sec->section_header->sh_link,esym->st_name); | |
|
774 | Elf_Symbol* sym = new Elf_Symbol(name,esym); | |
|
775 | symbols.append(sym); | |
|
776 | } | |
|
777 | } | |
|
778 | } | |
|
754 | 779 | |
|
755 | 780 | } |
|
756 | 781 | |
|
757 | 782 | |
|
758 | 783 | |
|
759 | ||
|
760 | ||
|
761 | 784 | QString ElfFile::getSectionType(int index) |
|
762 | 785 | { |
|
763 | 786 | QString type(""); |
@@ -40,10 +40,24 public: | |||
|
40 | 40 | this->data = data; |
|
41 | 41 | this->section_header = section_header; |
|
42 | 42 | } |
|
43 | ~Elf_Section() | |
|
44 | { | |
|
45 | free(section_header); | |
|
46 | } | |
|
43 | 47 | Elf_Data* data; |
|
44 | 48 | GElf_Shdr* section_header; |
|
45 | 49 | }; |
|
46 | 50 | |
|
51 | class Elf_Symbol | |
|
52 | { | |
|
53 | public: | |
|
54 | Elf_Symbol(){} | |
|
55 | Elf_Symbol(const QString& name,GElf_Sym* sym):name(name),sym(sym){} | |
|
56 | ~Elf_Symbol(){free(sym);} | |
|
57 | QString name; | |
|
58 | GElf_Sym* sym; | |
|
59 | }; | |
|
60 | ||
|
47 | 61 | class ElfFile : public abstractExecFile |
|
48 | 62 | { |
|
49 | 63 | Q_OBJECT |
@@ -98,6 +112,7 private: | |||
|
98 | 112 | size_t SymbolCount,SectionCount,SegmentCount, shstrndx; |
|
99 | 113 | QList<GElf_Phdr*> Segments; |
|
100 | 114 | QList<Elf_Section*> sections; |
|
115 | QList<Elf_Symbol*> symbols; | |
|
101 | 116 | |
|
102 | 117 | }; |
|
103 | 118 |
@@ -26,7 +26,7 void elfFileWidget::updateElfFile(ElfFil | |||
|
26 | 26 | this->ui->entryPointLabel->setText(QString("0x%1").arg((uint)p_elf->getEntryPointAddress(),8,16)); |
|
27 | 27 | this->ui->typeLabel->setText(p_elf->getType()); |
|
28 | 28 | this->ui->sectionCountLabel->setText(QString::number(p_elf->getSectionCount())); |
|
29 |
|
|
|
29 | this->ui->symbolCountLabel->setText(QString::number(p_elf->getSymbolCount())); | |
|
30 | 30 | } |
|
31 | 31 | } |
|
32 | 32 |
General Comments 0
You need to be logged in to leave comments.
Login now