@@ -708,8 +708,12 QString ElfFile::getSegmentFlags(int ind | |||
|
708 | 708 | |
|
709 | 709 | QString ElfFile::getSectionName(int index) |
|
710 | 710 | { |
|
711 | char* nameChr = elf_strptr(this->e , this->shstrndx , this->sections.at(index)->section_header->sh_name); | |
|
712 | return QString(nameChr); | |
|
711 | if((index<sections.count()) && (index>=0)) | |
|
712 | { | |
|
713 | char* nameChr = elf_strptr(this->e , this->shstrndx , this->sections.at(index)->section_header->sh_name); | |
|
714 | return QString(nameChr); | |
|
715 | } | |
|
716 | return ""; | |
|
713 | 717 | } |
|
714 | 718 | |
|
715 | 719 | |
@@ -824,6 +828,162 QString ElfFile::getSectionType(int inde | |||
|
824 | 828 | return type; |
|
825 | 829 | } |
|
826 | 830 | |
|
831 | QString ElfFile::getSymbolName(int index) | |
|
832 | { | |
|
833 | if(this->e!=NULL) | |
|
834 | { | |
|
835 | if(index < this->symbols.count()) | |
|
836 | { | |
|
837 | return symbols.at(index)->name; | |
|
838 | } | |
|
839 | } | |
|
840 | return ""; | |
|
841 | } | |
|
842 | ||
|
843 | QString ElfFile::getSymbolType(int index) | |
|
844 | { | |
|
845 | if(this->e!=NULL) | |
|
846 | { | |
|
847 | if(index < this->symbols.count()) | |
|
848 | { | |
|
849 | int type = GELF_ST_TYPE(symbols.at(index)->sym->st_info); | |
|
850 | switch(type) | |
|
851 | { | |
|
852 | case STT_NOTYPE: | |
|
853 | return "No Type"; | |
|
854 | break; | |
|
855 | case STT_OBJECT: | |
|
856 | return "Object"; | |
|
857 | break; | |
|
858 | case STT_FUNC: | |
|
859 | return "Function"; | |
|
860 | break; | |
|
861 | case STT_SECTION: | |
|
862 | return "Section"; | |
|
863 | break; | |
|
864 | case STT_FILE: | |
|
865 | return "File"; | |
|
866 | break; | |
|
867 | case STT_COMMON: | |
|
868 | return "Common data object"; | |
|
869 | break; | |
|
870 | case STT_TLS: | |
|
871 | return "Thread-local data object"; | |
|
872 | break; | |
|
873 | case STT_NUM: | |
|
874 | return "Number of defined types"; | |
|
875 | break; | |
|
876 | case STT_LOOS: | |
|
877 | return "Start of OS-specific"; | |
|
878 | break; | |
|
879 | case STT_HIOS: | |
|
880 | return "End of OS-specific"; | |
|
881 | break; | |
|
882 | case STT_LOPROC: | |
|
883 | return "Start of processor-specific"; | |
|
884 | break; | |
|
885 | case STT_HIPROC: | |
|
886 | return "End of processor-specific"; | |
|
887 | break; | |
|
888 | default: | |
|
889 | return "none"; | |
|
890 | break; | |
|
891 | } | |
|
892 | } | |
|
893 | } | |
|
894 | return "none"; | |
|
895 | } | |
|
896 | ||
|
897 | quint64 ElfFile::getSymbolSize(int index) | |
|
898 | { | |
|
899 | if(this->e!=NULL) | |
|
900 | { | |
|
901 | if((index < this->symbols.count()) && (index>=0)) | |
|
902 | { | |
|
903 | return symbols.at(index)->sym->st_size; | |
|
904 | } | |
|
905 | } | |
|
906 | return 0; | |
|
907 | } | |
|
908 | ||
|
909 | QString ElfFile::getSymbolSectionName(int index) | |
|
910 | { | |
|
911 | if(this->e!=NULL) | |
|
912 | { | |
|
913 | if((index < this->symbols.count()) && (index>=0)) | |
|
914 | { | |
|
915 | return getSectionName(symbols.at(index)->sym->st_shndx-1); | |
|
916 | } | |
|
917 | } | |
|
918 | return "none"; | |
|
919 | } | |
|
920 | ||
|
921 | int ElfFile::getSymbolSectionIndex(int index) | |
|
922 | { | |
|
923 | if(this->e!=NULL) | |
|
924 | { | |
|
925 | if((index < this->symbols.count()) && (index>=0)) | |
|
926 | { | |
|
927 | return symbols.at(index)->sym->st_shndx; | |
|
928 | } | |
|
929 | } | |
|
930 | return 0; | |
|
931 | } | |
|
932 | ||
|
933 | quint64 ElfFile::getSymbolAddress(int index) | |
|
934 | { | |
|
935 | if(this->e!=NULL) | |
|
936 | { | |
|
937 | if((index < this->symbols.count()) && (index>=0)) | |
|
938 | { | |
|
939 | return symbols.at(index)->sym->st_value; | |
|
940 | } | |
|
941 | } | |
|
942 | return 0; | |
|
943 | } | |
|
944 | ||
|
945 | QString ElfFile::getSymbolLinkType(int index) | |
|
946 | { | |
|
947 | if(this->e!=NULL) | |
|
948 | { | |
|
949 | if(index < this->symbols.count()) | |
|
950 | { | |
|
951 | int btype = GELF_ST_BIND(symbols.at(index)->sym->st_info); | |
|
952 | switch(btype) | |
|
953 | { | |
|
954 | case STB_LOCAL: | |
|
955 | return "Local"; | |
|
956 | break; | |
|
957 | case STB_GLOBAL: | |
|
958 | return "Global"; | |
|
959 | break; | |
|
960 | case STB_WEAK: | |
|
961 | return "Weak"; | |
|
962 | break; | |
|
963 | case STB_NUM: | |
|
964 | return "Number of defined types"; | |
|
965 | break; | |
|
966 | case STB_LOOS: | |
|
967 | return "Start of OS-specific"; | |
|
968 | break; | |
|
969 | case STB_HIOS: | |
|
970 | return "End of OS-specific"; | |
|
971 | break; | |
|
972 | case STB_LOPROC: | |
|
973 | return "Start of processor-specific"; | |
|
974 | break; | |
|
975 | case STB_HIPROC: | |
|
976 | return "End of processor-specific"; | |
|
977 | break; | |
|
978 | default: | |
|
979 | return "none"; | |
|
980 | break; | |
|
981 | } | |
|
982 | } | |
|
983 | } | |
|
984 | return "none"; | |
|
985 | } | |
|
986 | ||
|
827 | 987 | bool ElfFile::isElf(const QString &File) |
|
828 | 988 | { |
|
829 | 989 | int file =0; |
@@ -77,22 +77,33 public: | |||
|
77 | 77 | QString getABI(); |
|
78 | 78 | qint64 getVersion(); |
|
79 | 79 | qint64 getEntryPointAddress(); |
|
80 | ||
|
80 | 81 | int getSectionCount(); |
|
81 | 82 | int getSymbolCount(); |
|
82 | 83 | int getSegmentCount(); |
|
84 | ||
|
83 | 85 | QString getSegmentType(int index); |
|
84 | 86 | qint64 getSegmentOffset(int index); |
|
85 | 87 | qint64 getSegmentVaddr(int index); |
|
86 | 88 | qint64 getSegmentPaddr(int index); |
|
87 | qint64 getSectionPaddr(int index); | |
|
88 | 89 | qint64 getSegmentFilesz(int index); |
|
89 | 90 | qint64 getSectionDatasz(int index); |
|
91 | qint64 getSegmentMemsz(int index); | |
|
92 | QString getSegmentFlags(int index); | |
|
93 | ||
|
90 | 94 | bool getSectionData(int index, char **buffer); |
|
91 |
qint64 getSe |
|
|
95 | qint64 getSectionPaddr(int index); | |
|
92 | 96 | qint64 getSectionMemsz(int index); |
|
93 | QString getSegmentFlags(int index); | |
|
94 | 97 | QString getSectionName(int index); |
|
95 | 98 | QString getSectionType(int index); |
|
99 | ||
|
100 | QString getSymbolName(int index); | |
|
101 | QString getSymbolType(int index); | |
|
102 | quint64 getSymbolSize(int index); | |
|
103 | QString getSymbolSectionName(int index); | |
|
104 | int getSymbolSectionIndex(int index); | |
|
105 | quint64 getSymbolAddress(int index); | |
|
106 | QString getSymbolLinkType(int index); | |
|
96 | 107 | bool iself(); |
|
97 | 108 | static bool isElf(const QString& File); |
|
98 | 109 |
@@ -1,5 +1,6 | |||
|
1 | 1 | #include "elffilewidget.h" |
|
2 | 2 | #include "ui_elffilewidget.h" |
|
3 | #include <QtWidgets/QTableWidgetItem> | |
|
3 | 4 | |
|
4 | 5 | elfFileWidget::elfFileWidget(QWidget *parent) : |
|
5 | 6 | QWidget(parent), |
@@ -28,6 +29,41 void elfFileWidget::updateElfFile(ElfFil | |||
|
28 | 29 | this->ui->sectionCountLabel->setText(QString::number(p_elf->getSectionCount())); |
|
29 | 30 | this->ui->symbolCountLabel->setText(QString::number(p_elf->getSymbolCount())); |
|
30 | 31 | } |
|
32 | updateSymbols(); | |
|
33 | } | |
|
34 | ||
|
35 | void elfFileWidget::updateSymbols() | |
|
36 | { | |
|
37 | this->ui->symbolsList->clear(); | |
|
38 | this->ui->symbolsList->setRowCount(p_elf->getSymbolCount()); | |
|
39 | this->ui->symbolsList->setHorizontalHeaderLabels(QStringList()<<"Value"<<"Size"<<"Type"<<"Link"<<"Section"<<"Name"); | |
|
40 | for(int i=0;i<p_elf->getSymbolCount();i++) | |
|
41 | { | |
|
42 | QTableWidgetItem *newItem = new QTableWidgetItem(QString("0x%1").arg(p_elf->getSymbolAddress(i),8,16)); | |
|
43 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |
|
44 | this->ui->symbolsList->setItem(i, 0, newItem); | |
|
45 | ||
|
46 | newItem = new QTableWidgetItem(QString("0x%1").arg(p_elf->getSymbolSize(i),8,16)); | |
|
47 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |
|
48 | this->ui->symbolsList->setItem(i, 1, newItem); | |
|
49 | ||
|
50 | newItem = new QTableWidgetItem(p_elf->getSymbolType(i)); | |
|
51 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |
|
52 | this->ui->symbolsList->setItem(i, 2, newItem); | |
|
53 | ||
|
54 | newItem = new QTableWidgetItem(p_elf->getSymbolLinkType(i)); | |
|
55 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |
|
56 | this->ui->symbolsList->setItem(i, 3, newItem); | |
|
57 | ||
|
58 | newItem = new QTableWidgetItem(p_elf->getSymbolSectionName(i)); | |
|
59 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |
|
60 | this->ui->symbolsList->setItem(i, 4, newItem); | |
|
61 | ||
|
62 | newItem = new QTableWidgetItem(p_elf->getSymbolName(i)); | |
|
63 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |
|
64 | this->ui->symbolsList->setItem(i, 5, newItem); | |
|
65 | } | |
|
66 | this->ui->symbolsList->resizeColumnsToContents(); | |
|
31 | 67 | } |
|
32 | 68 | |
|
33 | 69 | |
@@ -43,4 +79,3 void elfFileWidget::updateElfFile(ElfFil | |||
|
43 | 79 | |
|
44 | 80 | |
|
45 | 81 | |
|
46 |
@@ -18,6 +18,7 public: | |||
|
18 | 18 | |
|
19 | 19 | public slots: |
|
20 | 20 | void updateElfFile(ElfFile* file); |
|
21 | void updateSymbols(); | |
|
21 | 22 | |
|
22 | 23 | private: |
|
23 | 24 | Ui::elfFileWidget *ui; |
@@ -6,8 +6,8 | |||
|
6 | 6 | <rect> |
|
7 | 7 | <x>0</x> |
|
8 | 8 | <y>0</y> |
|
9 |
<width>6 |
|
|
10 |
<height>3 |
|
|
9 | <width>786</width> | |
|
10 | <height>387</height> | |
|
11 | 11 | </rect> |
|
12 | 12 | </property> |
|
13 | 13 | <property name="minimumSize"> |
@@ -26,7 +26,7 | |||
|
26 | 26 | <item row="0" column="0"> |
|
27 | 27 | <widget class="QTabWidget" name="tabWidget"> |
|
28 | 28 | <property name="currentIndex"> |
|
29 |
<number> |
|
|
29 | <number>1</number> | |
|
30 | 30 | </property> |
|
31 | 31 | <widget class="QWidget" name="generalInfoTab"> |
|
32 | 32 | <attribute name="title"> |
@@ -185,7 +185,41 | |||
|
185 | 185 | </attribute> |
|
186 | 186 | <layout class="QGridLayout" name="gridLayout_2"> |
|
187 | 187 | <item row="0" column="0"> |
|
188 |
<widget class="QTableWidget" name="symbolsList" |
|
|
188 | <widget class="QTableWidget" name="symbolsList"> | |
|
189 | <property name="sortingEnabled"> | |
|
190 | <bool>true</bool> | |
|
191 | </property> | |
|
192 | <column> | |
|
193 | <property name="text"> | |
|
194 | <string>Value</string> | |
|
195 | </property> | |
|
196 | </column> | |
|
197 | <column> | |
|
198 | <property name="text"> | |
|
199 | <string>Size</string> | |
|
200 | </property> | |
|
201 | </column> | |
|
202 | <column> | |
|
203 | <property name="text"> | |
|
204 | <string>Type</string> | |
|
205 | </property> | |
|
206 | </column> | |
|
207 | <column> | |
|
208 | <property name="text"> | |
|
209 | <string>Link</string> | |
|
210 | </property> | |
|
211 | </column> | |
|
212 | <column> | |
|
213 | <property name="text"> | |
|
214 | <string>Section</string> | |
|
215 | </property> | |
|
216 | </column> | |
|
217 | <column> | |
|
218 | <property name="text"> | |
|
219 | <string>Name</string> | |
|
220 | </property> | |
|
221 | </column> | |
|
222 | </widget> | |
|
189 | 223 | </item> |
|
190 | 224 | </layout> |
|
191 | 225 | </widget> |
General Comments 0
You need to be logged in to leave comments.
Login now