@@ -0,0 +1,175 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #include "binaryfile.h" | |||
|
23 | #include "srecfile.h" | |||
|
24 | ||||
|
25 | binaryFile::binaryFile() | |||
|
26 | { | |||
|
27 | } | |||
|
28 | ||||
|
29 | binaryFile::binaryFile(const QString &File) | |||
|
30 | { | |||
|
31 | openFile(File); | |||
|
32 | } | |||
|
33 | ||||
|
34 | binaryFile::binaryFile(const QStringList &Files) | |||
|
35 | { | |||
|
36 | openFiles(Files); | |||
|
37 | } | |||
|
38 | ||||
|
39 | binaryFile::~binaryFile() | |||
|
40 | { | |||
|
41 | ||||
|
42 | } | |||
|
43 | ||||
|
44 | bool binaryFile::openFile(const QString &File) | |||
|
45 | { | |||
|
46 | return openFiles(QStringList()<<File); | |||
|
47 | } | |||
|
48 | ||||
|
49 | bool binaryFile::openFiles(const QStringList &Files) | |||
|
50 | { | |||
|
51 | for(int i=0;i<Files.count();i++) | |||
|
52 | { | |||
|
53 | this->p_files.append(new QFile(Files.at(i))); | |||
|
54 | this->p_files.at(i)->open(QIODevice::ReadOnly); | |||
|
55 | loadFile(this->p_files.at(i)); | |||
|
56 | } | |||
|
57 | return true; | |||
|
58 | } | |||
|
59 | ||||
|
60 | bool binaryFile::isopened() | |||
|
61 | { | |||
|
62 | bool opened = true; | |||
|
63 | for(int i=0;i<this->p_files.count();i++) | |||
|
64 | { | |||
|
65 | opened &= p_files.at(i)->isOpen(); | |||
|
66 | } | |||
|
67 | return opened; | |||
|
68 | } | |||
|
69 | ||||
|
70 | int binaryFile::closeFile() | |||
|
71 | { | |||
|
72 | for(int i=0;i<p_files.count();i++) | |||
|
73 | { | |||
|
74 | delete p_files.at(i); | |||
|
75 | for(int j=0;j<p_fragments.count();j++) | |||
|
76 | { | |||
|
77 | if(p_fragments.at(j)->header == p_files.at(i)->fileName()) | |||
|
78 | { | |||
|
79 | codeFragment* fragment = p_fragments.at(j); | |||
|
80 | p_fragments.removeAt(j); | |||
|
81 | delete fragment; | |||
|
82 | } | |||
|
83 | } | |||
|
84 | } | |||
|
85 | p_files.clear(); | |||
|
86 | p_fileName.clear(); | |||
|
87 | return 0; | |||
|
88 | } | |||
|
89 | ||||
|
90 | QList<codeFragment *> binaryFile::getFragments() | |||
|
91 | { | |||
|
92 | return p_fragments; | |||
|
93 | } | |||
|
94 | ||||
|
95 | int binaryFile::getFragmentsCount() | |||
|
96 | { | |||
|
97 | return p_fragments.count(); | |||
|
98 | } | |||
|
99 | ||||
|
100 | int binaryFile::getFragmentAddress(int index) | |||
|
101 | { | |||
|
102 | if((index>=0)&&(index<p_fragments.count())) | |||
|
103 | return p_fragments.at(index)->address; | |||
|
104 | return 0; | |||
|
105 | } | |||
|
106 | ||||
|
107 | int binaryFile::getFragmentSize(int index) | |||
|
108 | { | |||
|
109 | if((index>=0)&&(index<p_fragments.count())) | |||
|
110 | return p_fragments.at(index)->size; | |||
|
111 | return 0; | |||
|
112 | } | |||
|
113 | ||||
|
114 | QString binaryFile::getFragmentHeader(int index) | |||
|
115 | { | |||
|
116 | if((index>=0)&&(index<p_fragments.count())) | |||
|
117 | return p_fragments.at(index)->header; | |||
|
118 | return ""; | |||
|
119 | } | |||
|
120 | ||||
|
121 | codeFragment *binaryFile::getFragment(int index) | |||
|
122 | { | |||
|
123 | if((index>=0)&&(index<p_fragments.count())) | |||
|
124 | return p_fragments.at(index); | |||
|
125 | return NULL; | |||
|
126 | } | |||
|
127 | ||||
|
128 | bool binaryFile::getFragmentData(int index, char **buffer) | |||
|
129 | { | |||
|
130 | if((index>=0)&&(index<p_fragments.count())) | |||
|
131 | { | |||
|
132 | *buffer = p_fragments.at(index)->data; | |||
|
133 | return true; | |||
|
134 | } | |||
|
135 | return false; | |||
|
136 | } | |||
|
137 | ||||
|
138 | bool binaryFile::toSrec(const QString &fileName) | |||
|
139 | { | |||
|
140 | srecFile::toSrec(p_fragments,fileName); | |||
|
141 | } | |||
|
142 | ||||
|
143 | bool binaryFile::toBinary(const QString &fileName) | |||
|
144 | { | |||
|
145 | toBinary(p_fragments,fileName); | |||
|
146 | } | |||
|
147 | ||||
|
148 | bool binaryFile::toBinary(QList<codeFragment *> fragments, const QString &File) | |||
|
149 | { | |||
|
150 | QFile file(File); | |||
|
151 | file.open(QIODevice::WriteOnly); | |||
|
152 | if(file.isOpen()) | |||
|
153 | { | |||
|
154 | for(int i=0;i<fragments.count();i++) | |||
|
155 | { | |||
|
156 | file.write(fragments.at(i)->data,fragments.at(i)->size); | |||
|
157 | } | |||
|
158 | return true; | |||
|
159 | } | |||
|
160 | return false; | |||
|
161 | } | |||
|
162 | ||||
|
163 | void binaryFile::loadFile(QFile *file) | |||
|
164 | { | |||
|
165 | if (file->isOpen()) | |||
|
166 | { | |||
|
167 | codeFragment* fragment = new codeFragment(); | |||
|
168 | fragment->header = file->fileName(); | |||
|
169 | fragment->address = 0; | |||
|
170 | fragment->size = file->size(); | |||
|
171 | fragment->data = (char*)malloc(file->size()); | |||
|
172 | file->read(fragment->data,file->size()); | |||
|
173 | p_fragments.append(fragment); | |||
|
174 | } | |||
|
175 | } |
@@ -0,0 +1,64 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #ifndef BINARYFILE_H | |||
|
23 | #define BINARYFILE_H | |||
|
24 | #include "abstractbinfile.h" | |||
|
25 | #include <QObject> | |||
|
26 | #include <QString> | |||
|
27 | #include <QList> | |||
|
28 | #include <QStringList> | |||
|
29 | #include <QFile> | |||
|
30 | ||||
|
31 | class binaryFile : public abstractBinFile | |||
|
32 | { | |||
|
33 | Q_OBJECT | |||
|
34 | public: | |||
|
35 | explicit binaryFile(); | |||
|
36 | binaryFile(const QString& File); | |||
|
37 | binaryFile(const QStringList& Files); | |||
|
38 | ~binaryFile(); | |||
|
39 | bool openFile(const QString& File); | |||
|
40 | bool openFiles(const QStringList& Files); | |||
|
41 | bool isopened(); | |||
|
42 | int closeFile(); | |||
|
43 | QList<codeFragment*> getFragments(); | |||
|
44 | int getFragmentsCount(); | |||
|
45 | int getFragmentAddress(int index); | |||
|
46 | int getFragmentSize(int index); | |||
|
47 | QString getFragmentHeader(int index); | |||
|
48 | codeFragment* getFragment(int index); | |||
|
49 | bool getFragmentData(int index, char **buffer); | |||
|
50 | bool toSrec(const QString& fileName); | |||
|
51 | bool toBinary(const QString& fileName); | |||
|
52 | static bool toBinary(QList<codeFragment*> fragments,const QString& File); | |||
|
53 | signals: | |||
|
54 | ||||
|
55 | public slots: | |||
|
56 | ||||
|
57 | private: | |||
|
58 | void loadFile(QFile *file); | |||
|
59 | QStringList p_fileNames; | |||
|
60 | QList<QFile*>p_files; | |||
|
61 | QList<codeFragment*> p_fragments; | |||
|
62 | }; | |||
|
63 | ||||
|
64 | #endif // BINARYFILE_H |
@@ -0,0 +1,150 | |||||
|
1 | #include "binaryfilewidget.h" | |||
|
2 | #include "ui_binaryfilewidget.h" | |||
|
3 | #include "qtablewidgetintitem.h" | |||
|
4 | #include <QtWidgets/QTableWidget> | |||
|
5 | #include <QtWidgets/QFileDialog> | |||
|
6 | #include "srecfile.h" | |||
|
7 | ||||
|
8 | binaryFileWidget::binaryFileWidget(QWidget *parent) : | |||
|
9 | abstractBinFileWidget(parent), | |||
|
10 | ui(new Ui::binaryFileWidget) | |||
|
11 | { | |||
|
12 | ui->setupUi(this); | |||
|
13 | connect(this->ui->fragmentList,SIGNAL(cellActivated(int,int)),this,SLOT(fragmentCellActivated(int,int))); | |||
|
14 | connect(this->ui->fragmentList,SIGNAL(cellChanged(int,int)),this,SLOT(fragmentCellChanged(int,int))); | |||
|
15 | exportToSREC_action = new QAction(tr("Export to SREC"),this); | |||
|
16 | exportToBIN_action = new QAction(tr("Export to Binary"),this); | |||
|
17 | this->ui->fragmentList->addAction(exportToBIN_action); | |||
|
18 | this->ui->fragmentList->addAction(exportToSREC_action); | |||
|
19 | connect(this->exportToBIN_action,SIGNAL(triggered()),this,SLOT(exportToBIN())); | |||
|
20 | connect(this->exportToSREC_action,SIGNAL(triggered()),this,SLOT(exportToSREC())); | |||
|
21 | } | |||
|
22 | ||||
|
23 | binaryFileWidget::~binaryFileWidget() | |||
|
24 | { | |||
|
25 | delete ui; | |||
|
26 | } | |||
|
27 | ||||
|
28 | void binaryFileWidget::setFile(abstractBinFile *file) | |||
|
29 | { | |||
|
30 | this->p_binfile = (binaryFile*)file; | |||
|
31 | if(p_binfile->isopened()) | |||
|
32 | { | |||
|
33 | reloadFile(); | |||
|
34 | } | |||
|
35 | } | |||
|
36 | ||||
|
37 | void binaryFileWidget::reloadFile() | |||
|
38 | { | |||
|
39 | this->ui->fragmentList->clear(); | |||
|
40 | this->ui->fragmentList->setRowCount(p_binfile->getFragmentsCount()); | |||
|
41 | this->ui->fragmentList->setHorizontalHeaderLabels(QStringList()<<"File"<<"Size"<<"Address"); | |||
|
42 | for(int i=0;i<p_binfile->getFragmentsCount();i++) | |||
|
43 | { | |||
|
44 | QTableWidgetItem *newItem = new QTableWidgetItem(p_binfile->getFragmentHeader(i)); | |||
|
45 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
46 | this->ui->fragmentList->setItem(i, 0, newItem); | |||
|
47 | ||||
|
48 | newItem = (QTableWidgetItem*)new QTableWidgetIntItem(QString("%1").arg(p_binfile->getFragmentSize(i)),DecimalItem); | |||
|
49 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
50 | this->ui->fragmentList->setItem(i, 1, newItem); | |||
|
51 | ||||
|
52 | newItem = (QTableWidgetItem*)new QTableWidgetIntItem(QString("0x%1").arg(p_binfile->getFragmentAddress(i),8,16).replace(" ","0"),HexaDecimalItem); | |||
|
53 | // newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
54 | this->ui->fragmentList->setItem(i, 2, newItem); | |||
|
55 | ||||
|
56 | } | |||
|
57 | this->ui->fragmentList->resizeColumnsToContents(); | |||
|
58 | } | |||
|
59 | ||||
|
60 | void binaryFileWidget::fragmentCellActivated(int row, int column) | |||
|
61 | { | |||
|
62 | Q_UNUSED(column) | |||
|
63 | char* buff=NULL; | |||
|
64 | int index = this->ui->fragmentList->item(row,0)->text().toInt(); | |||
|
65 | if(index!=-1) | |||
|
66 | { | |||
|
67 | this->p_binfile->getFragmentData(index,&buff); | |||
|
68 | this->ui->hexViewer->setData(QByteArray(buff,this->p_binfile->getFragmentSize(index))); | |||
|
69 | this->ui->hexViewer->setAddressOffset(this->p_binfile->getFragmentAddress(index)); | |||
|
70 | } | |||
|
71 | } | |||
|
72 | ||||
|
73 | void binaryFileWidget::fragmentCellChanged(int row, int column) | |||
|
74 | { | |||
|
75 | if(column==2) | |||
|
76 | { | |||
|
77 | QString newAddressStr = this->ui->fragmentList->item(row,column)->text(); | |||
|
78 | int newAddress = 0; | |||
|
79 | newAddressStr.remove(" "); | |||
|
80 | if(newAddressStr.at(0)=='0' && newAddressStr.at(1)=='x') | |||
|
81 | { | |||
|
82 | newAddress = newAddressStr.remove("0x").toUInt(0,16); | |||
|
83 | } | |||
|
84 | else | |||
|
85 | { | |||
|
86 | newAddress = newAddressStr.toUInt(); | |||
|
87 | } | |||
|
88 | this->p_binfile->getFragments().at(row)->address = newAddress; | |||
|
89 | } | |||
|
90 | } | |||
|
91 | ||||
|
92 | void binaryFileWidget::exportToSREC() | |||
|
93 | { | |||
|
94 | QList<codeFragment *> SelectedFragmentsList=getSelectedFragments(); | |||
|
95 | if(SelectedFragmentsList.count()>0) | |||
|
96 | { | |||
|
97 | QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), | |||
|
98 | NULL, | |||
|
99 | tr("SREC Files (*.srec)")); | |||
|
100 | if(!fileName.isEmpty()) | |||
|
101 | { | |||
|
102 | srecFile::toSrec(SelectedFragmentsList,fileName); | |||
|
103 | } | |||
|
104 | } | |||
|
105 | } | |||
|
106 | ||||
|
107 | void binaryFileWidget::exportToBIN() | |||
|
108 | { | |||
|
109 | QList<codeFragment *> SelectedFragmentsList=getSelectedFragments(); | |||
|
110 | if(SelectedFragmentsList.count()>0) | |||
|
111 | { | |||
|
112 | QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), | |||
|
113 | NULL, | |||
|
114 | tr("Binary Files (*.bin)")); | |||
|
115 | if(!fileName.isEmpty()) | |||
|
116 | { | |||
|
117 | binaryFile::toBinary(SelectedFragmentsList,fileName); | |||
|
118 | } | |||
|
119 | } | |||
|
120 | } | |||
|
121 | ||||
|
122 | QStringList binaryFileWidget::getSelectedFilesNames() | |||
|
123 | { | |||
|
124 | QStringList SelectedFilesList; | |||
|
125 | QList<QTableWidgetItem*> items = this->ui->fragmentList->selectedItems(); | |||
|
126 | for(int i=0;i<items.count();i++) | |||
|
127 | { | |||
|
128 | QString file = p_binfile->getFragmentHeader(items.at(i)->row()); | |||
|
129 | if(!SelectedFilesList.contains(file)) | |||
|
130 | { | |||
|
131 | SelectedFilesList.append(file); | |||
|
132 | } | |||
|
133 | } | |||
|
134 | return SelectedFilesList; | |||
|
135 | } | |||
|
136 | ||||
|
137 | QList<codeFragment *> binaryFileWidget::getSelectedFragments() | |||
|
138 | { | |||
|
139 | QList<codeFragment *> SelectedFragmentsList; | |||
|
140 | QList<QTableWidgetItem*> items = this->ui->fragmentList->selectedItems(); | |||
|
141 | for(int i=0;i<items.count();i++) | |||
|
142 | { | |||
|
143 | codeFragment * fragment = p_binfile->getFragment(items.at(i)->row()); | |||
|
144 | if(!SelectedFragmentsList.contains(fragment)) | |||
|
145 | { | |||
|
146 | SelectedFragmentsList.append(fragment); | |||
|
147 | } | |||
|
148 | } | |||
|
149 | return SelectedFragmentsList; | |||
|
150 | } |
@@ -0,0 +1,60 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #ifndef BINARYFILEWIDGET_H | |||
|
23 | #define BINARYFILEWIDGET_H | |||
|
24 | ||||
|
25 | #include <QWidget> | |||
|
26 | #include "binaryfile.h" | |||
|
27 | #include <QAction> | |||
|
28 | ||||
|
29 | namespace Ui { | |||
|
30 | class binaryFileWidget; | |||
|
31 | } | |||
|
32 | ||||
|
33 | class binaryFileWidget : public abstractBinFileWidget | |||
|
34 | { | |||
|
35 | Q_OBJECT | |||
|
36 | ||||
|
37 | public: | |||
|
38 | explicit binaryFileWidget(QWidget *parent = 0); | |||
|
39 | ~binaryFileWidget(); | |||
|
40 | ||||
|
41 | public slots: | |||
|
42 | void setFile(abstractBinFile* file); | |||
|
43 | void reloadFile(); | |||
|
44 | ||||
|
45 | private slots: | |||
|
46 | void fragmentCellActivated(int row, int column); | |||
|
47 | void fragmentCellChanged(int row, int column); | |||
|
48 | void exportToSREC(); | |||
|
49 | void exportToBIN(); | |||
|
50 | ||||
|
51 | private: | |||
|
52 | QStringList getSelectedFilesNames(); | |||
|
53 | QList<codeFragment *> getSelectedFragments(); | |||
|
54 | Ui::binaryFileWidget *ui; | |||
|
55 | binaryFile* p_binfile; | |||
|
56 | QAction* exportToSREC_action; | |||
|
57 | QAction* exportToBIN_action; | |||
|
58 | }; | |||
|
59 | ||||
|
60 | #endif // BINARYFILEWIDGET_H |
@@ -0,0 +1,64 | |||||
|
1 | <?xml version="1.0" encoding="UTF-8"?> | |||
|
2 | <ui version="4.0"> | |||
|
3 | <class>binaryFileWidget</class> | |||
|
4 | <widget class="QWidget" name="binaryFileWidget"> | |||
|
5 | <property name="geometry"> | |||
|
6 | <rect> | |||
|
7 | <x>0</x> | |||
|
8 | <y>0</y> | |||
|
9 | <width>637</width> | |||
|
10 | <height>342</height> | |||
|
11 | </rect> | |||
|
12 | </property> | |||
|
13 | <property name="windowTitle"> | |||
|
14 | <string>Form</string> | |||
|
15 | </property> | |||
|
16 | <layout class="QGridLayout" name="gridLayout"> | |||
|
17 | <item row="0" column="0"> | |||
|
18 | <widget class="QSplitter" name="splitter"> | |||
|
19 | <property name="orientation"> | |||
|
20 | <enum>Qt::Horizontal</enum> | |||
|
21 | </property> | |||
|
22 | <widget class="QHexEdit" name="hexViewer" native="true"> | |||
|
23 | <property name="minimumSize"> | |||
|
24 | <size> | |||
|
25 | <width>200</width> | |||
|
26 | <height>0</height> | |||
|
27 | </size> | |||
|
28 | </property> | |||
|
29 | </widget> | |||
|
30 | <widget class="QTableWidget" name="fragmentList"> | |||
|
31 | <property name="contextMenuPolicy"> | |||
|
32 | <enum>Qt::ActionsContextMenu</enum> | |||
|
33 | </property> | |||
|
34 | <column> | |||
|
35 | <property name="text"> | |||
|
36 | <string>File</string> | |||
|
37 | </property> | |||
|
38 | </column> | |||
|
39 | <column> | |||
|
40 | <property name="text"> | |||
|
41 | <string>Size</string> | |||
|
42 | </property> | |||
|
43 | </column> | |||
|
44 | <column> | |||
|
45 | <property name="text"> | |||
|
46 | <string>Address</string> | |||
|
47 | </property> | |||
|
48 | </column> | |||
|
49 | </widget> | |||
|
50 | </widget> | |||
|
51 | </item> | |||
|
52 | </layout> | |||
|
53 | </widget> | |||
|
54 | <customwidgets> | |||
|
55 | <customwidget> | |||
|
56 | <class>QHexEdit</class> | |||
|
57 | <extends>QWidget</extends> | |||
|
58 | <header location="global">qhexedit.h</header> | |||
|
59 | <container>1</container> | |||
|
60 | </customwidget> | |||
|
61 | </customwidgets> | |||
|
62 | <resources/> | |||
|
63 | <connections/> | |||
|
64 | </ui> |
@@ -0,0 +1,30 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #include "abstractbinfile.h" | |||
|
23 | ||||
|
24 | ||||
|
25 | codeFragment::codeFragment() | |||
|
26 | { | |||
|
27 | data = NULL; | |||
|
28 | size = 0; | |||
|
29 | address = 0; | |||
|
30 | } |
@@ -0,0 +1,71 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #ifndef ABSTRACTBINFILE_H | |||
|
23 | #define ABSTRACTBINFILE_H | |||
|
24 | ||||
|
25 | #include <QtCore/QObject> | |||
|
26 | #include <QtWidgets/QWidget> | |||
|
27 | ||||
|
28 | class codeFragment | |||
|
29 | { | |||
|
30 | public: | |||
|
31 | codeFragment(); | |||
|
32 | codeFragment(char* data, quint64 size, quint64 address):data(data),size(size),address(address){} | |||
|
33 | ~codeFragment() | |||
|
34 | { | |||
|
35 | free(data); | |||
|
36 | } | |||
|
37 | QString header; | |||
|
38 | char* data; | |||
|
39 | quint64 size; | |||
|
40 | quint64 address; | |||
|
41 | }; | |||
|
42 | ||||
|
43 | class abstractBinFile : public QObject | |||
|
44 | { | |||
|
45 | Q_OBJECT | |||
|
46 | public: | |||
|
47 | ||||
|
48 | virtual bool openFile(const QString& File)=0; | |||
|
49 | virtual bool isopened()=0; | |||
|
50 | virtual int closeFile()=0; | |||
|
51 | virtual QList<codeFragment*> getFragments()=0; | |||
|
52 | virtual bool toSrec(const QString& File)=0; | |||
|
53 | virtual bool toBinary(const QString& File)=0; | |||
|
54 | protected: | |||
|
55 | QString p_fileName; | |||
|
56 | }; | |||
|
57 | ||||
|
58 | ||||
|
59 | class abstractBinFileWidget : public QWidget | |||
|
60 | { | |||
|
61 | Q_OBJECT | |||
|
62 | ||||
|
63 | public: | |||
|
64 | abstractBinFileWidget(QWidget* parent = 0):QWidget(parent){} | |||
|
65 | ||||
|
66 | public slots: | |||
|
67 | virtual void setFile(abstractBinFile* file)=0; | |||
|
68 | virtual void reloadFile()=0; | |||
|
69 | }; | |||
|
70 | ||||
|
71 | #endif // ABSTRACTBINFILE_H |
This diff has been collapsed as it changes many lines, (1075 lines changed) Show them Hide them | |||||
@@ -0,0 +1,1075 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : | |||
|
20 | Alexis Jeandet | |||
|
21 | -- Mail : | |||
|
22 | alexis.jeandet@member.fsf.org | |||
|
23 | ----------------------------------------------------------------------------*/ | |||
|
24 | #include "elffile.h" | |||
|
25 | #include "srecfile.h" | |||
|
26 | #include "binaryfile.h" | |||
|
27 | #include <stdint.h> | |||
|
28 | ||||
|
29 | ElfFile::ElfFile() | |||
|
30 | :abstractBinFile() | |||
|
31 | { | |||
|
32 | this->opened = false; | |||
|
33 | this->type_elf = false; | |||
|
34 | this->elfFile = (int)NULL; | |||
|
35 | this->e = NULL; | |||
|
36 | } | |||
|
37 | ||||
|
38 | ElfFile::ElfFile(const QString &File) | |||
|
39 | :abstractBinFile() | |||
|
40 | { | |||
|
41 | this->opened = false; | |||
|
42 | this->type_elf = false; | |||
|
43 | this->elfFile = (int)NULL; | |||
|
44 | this->e = NULL; | |||
|
45 | this->p_fileName = File; | |||
|
46 | openFile(File); | |||
|
47 | } | |||
|
48 | ||||
|
49 | ElfFile::~ElfFile() | |||
|
50 | { | |||
|
51 | closeFile(); | |||
|
52 | if(scn)free(scn); | |||
|
53 | if(data)free(data); | |||
|
54 | for(int i=0;i<this->sections.count();i++) | |||
|
55 | { | |||
|
56 | delete this->sections.at(i); | |||
|
57 | } | |||
|
58 | this->sections.clear(); | |||
|
59 | for(int i=0;i<this->Segments.count();i++) | |||
|
60 | { | |||
|
61 | free(this->Segments.at(i)); | |||
|
62 | } | |||
|
63 | this->Segments.clear(); | |||
|
64 | for(int i=0;i<symbols.count();i++) | |||
|
65 | { | |||
|
66 | delete this->symbols.at(i); | |||
|
67 | } | |||
|
68 | this->symbols.clear(); | |||
|
69 | } | |||
|
70 | ||||
|
71 | bool ElfFile::openFile(const QString &File) | |||
|
72 | { | |||
|
73 | this->p_fileName = File; | |||
|
74 | this->closeFile(); | |||
|
75 | if(elf_version(EV_CURRENT)==EV_NONE)return 0; | |||
|
76 | #ifdef _ELF_WINDOWS_ | |||
|
77 | this->elfFile = open(File.toStdString().c_str(),O_RDONLY|O_BINARY ,0); | |||
|
78 | #else | |||
|
79 | this->elfFile = open(File.toStdString().c_str(),O_RDONLY ,0); | |||
|
80 | #endif | |||
|
81 | if(this->elfFile==(int)NULL)return 0; | |||
|
82 | this->e = elf_begin(this->elfFile,ELF_C_READ,NULL); | |||
|
83 | if(this->e==NULL)return 0; | |||
|
84 | this->ek = elf_kind(this->e); | |||
|
85 | gelf_getehdr (this->e, &this->ehdr ); | |||
|
86 | elf_getshdrstrndx (this->e, &this->shstrndx); | |||
|
87 | this->updateSegments(); | |||
|
88 | this->updateSections(); | |||
|
89 | this->updateSymbols(); | |||
|
90 | this->opened = true; | |||
|
91 | return 1; | |||
|
92 | } | |||
|
93 | ||||
|
94 | bool ElfFile::isopened() | |||
|
95 | { | |||
|
96 | return this->opened; | |||
|
97 | } | |||
|
98 | ||||
|
99 | int ElfFile::closeFile() | |||
|
100 | { | |||
|
101 | if(this->elfFile!=(int)NULL) | |||
|
102 | { | |||
|
103 | if(this->e!=NULL) | |||
|
104 | { | |||
|
105 | elf_end(this->e); | |||
|
106 | this->e = NULL; | |||
|
107 | } | |||
|
108 | close(this->elfFile); | |||
|
109 | this->elfFile = (int)NULL; | |||
|
110 | } | |||
|
111 | this->opened = false; | |||
|
112 | return 0; | |||
|
113 | } | |||
|
114 | ||||
|
115 | ||||
|
116 | QList<codeFragment*> ElfFile::getFragments(QStringList fragmentList) | |||
|
117 | { | |||
|
118 | QList<codeFragment*> fragments; | |||
|
119 | if (isopened()) | |||
|
120 | { | |||
|
121 | for(int i =0;i<fragmentList.count();i++) | |||
|
122 | { | |||
|
123 | fragments.append(getFragment(fragmentList.at(i))); | |||
|
124 | } | |||
|
125 | } | |||
|
126 | return fragments; | |||
|
127 | } | |||
|
128 | ||||
|
129 | QList<codeFragment*> ElfFile::getFragments() | |||
|
130 | { | |||
|
131 | return getFragments(QStringList()<<".data"<<".text"); | |||
|
132 | } | |||
|
133 | ||||
|
134 | codeFragment *ElfFile::getFragment(const QString &name) | |||
|
135 | { | |||
|
136 | codeFragment* fragment= new codeFragment(); | |||
|
137 | for(int i=0;i<getSectionCount();i++) | |||
|
138 | { | |||
|
139 | if(getSectionName(i) == name) | |||
|
140 | { | |||
|
141 | fragment->data =NULL; | |||
|
142 | fragment->size = getSectionDatasz(i); | |||
|
143 | fragment->address = getSectionPaddr(i); | |||
|
144 | getSectionData(i,&fragment->data); | |||
|
145 | } | |||
|
146 | } | |||
|
147 | return fragment; | |||
|
148 | } | |||
|
149 | ||||
|
150 | ||||
|
151 | ||||
|
152 | ||||
|
153 | ||||
|
154 | ||||
|
155 | ||||
|
156 | QString elfresolveMachine(Elf64_Half e_machine) | |||
|
157 | { | |||
|
158 | QString machineName; | |||
|
159 | //Update from with bash script don't write it by yourself! | |||
|
160 | switch(e_machine) | |||
|
161 | { | |||
|
162 | case EM_NONE: | |||
|
163 | machineName = " No machine "; | |||
|
164 | break; | |||
|
165 | case EM_M32: | |||
|
166 | machineName = " AT&T WE 32100 "; | |||
|
167 | break; | |||
|
168 | case EM_SPARC: | |||
|
169 | machineName = " SUN SPARC "; | |||
|
170 | break; | |||
|
171 | case EM_386: | |||
|
172 | machineName = " Intel 80386 "; | |||
|
173 | break; | |||
|
174 | case EM_68K: | |||
|
175 | machineName = " Motorola m68k family "; | |||
|
176 | break; | |||
|
177 | case EM_88K: | |||
|
178 | machineName = " Motorola m88k family "; | |||
|
179 | break; | |||
|
180 | case EM_860: | |||
|
181 | machineName = " Intel 80860 "; | |||
|
182 | break; | |||
|
183 | case EM_MIPS: | |||
|
184 | machineName = " MIPS R3000 big-endian "; | |||
|
185 | break; | |||
|
186 | case EM_S370: | |||
|
187 | machineName = " IBM System/370 "; | |||
|
188 | break; | |||
|
189 | case EM_MIPS_RS3_LE: | |||
|
190 | machineName = " MIPS R3000 little-endian "; | |||
|
191 | break; | |||
|
192 | case EM_PARISC: | |||
|
193 | machineName = " HPPA "; | |||
|
194 | break; | |||
|
195 | case EM_VPP500: | |||
|
196 | machineName = " Fujitsu VPP500 "; | |||
|
197 | break; | |||
|
198 | case EM_SPARC32PLUS: | |||
|
199 | machineName = " Sun's \"v8plus\" "; | |||
|
200 | break; | |||
|
201 | case EM_960: | |||
|
202 | machineName = " Intel 80960 "; | |||
|
203 | break; | |||
|
204 | case EM_PPC: | |||
|
205 | machineName = " PowerPC "; | |||
|
206 | break; | |||
|
207 | case EM_PPC64: | |||
|
208 | machineName = " PowerPC 64-bit "; | |||
|
209 | break; | |||
|
210 | case EM_S390: | |||
|
211 | machineName = " IBM S390 "; | |||
|
212 | break; | |||
|
213 | case EM_V800: | |||
|
214 | machineName = " NEC V800 series "; | |||
|
215 | break; | |||
|
216 | case EM_FR20: | |||
|
217 | machineName = " Fujitsu FR20 "; | |||
|
218 | break; | |||
|
219 | case EM_RH32: | |||
|
220 | machineName = " TRW RH-32 "; | |||
|
221 | break; | |||
|
222 | case EM_RCE: | |||
|
223 | machineName = " Motorola RCE "; | |||
|
224 | break; | |||
|
225 | case EM_ARM: | |||
|
226 | machineName = " ARM "; | |||
|
227 | break; | |||
|
228 | case EM_FAKE_ALPHA: | |||
|
229 | machineName = " Digital Alpha "; | |||
|
230 | break; | |||
|
231 | case EM_SH: | |||
|
232 | machineName = " Hitachi SH "; | |||
|
233 | break; | |||
|
234 | case EM_SPARCV9: | |||
|
235 | machineName = " SPARC v9 64-bit "; | |||
|
236 | break; | |||
|
237 | case EM_TRICORE: | |||
|
238 | machineName = " Siemens Tricore "; | |||
|
239 | break; | |||
|
240 | case EM_ARC: | |||
|
241 | machineName = " Argonaut RISC Core "; | |||
|
242 | break; | |||
|
243 | case EM_H8_300: | |||
|
244 | machineName = " Hitachi H8/300 "; | |||
|
245 | break; | |||
|
246 | case EM_H8_300H: | |||
|
247 | machineName = " Hitachi H8/300H "; | |||
|
248 | break; | |||
|
249 | case EM_H8S: | |||
|
250 | machineName = " Hitachi H8S "; | |||
|
251 | break; | |||
|
252 | case EM_H8_500: | |||
|
253 | machineName = " Hitachi H8/500 "; | |||
|
254 | break; | |||
|
255 | case EM_IA_64: | |||
|
256 | machineName = " Intel Merced "; | |||
|
257 | break; | |||
|
258 | case EM_MIPS_X: | |||
|
259 | machineName = " Stanford MIPS-X "; | |||
|
260 | break; | |||
|
261 | case EM_COLDFIRE: | |||
|
262 | machineName = " Motorola Coldfire "; | |||
|
263 | break; | |||
|
264 | case EM_68HC12: | |||
|
265 | machineName = " Motorola M68HC12 "; | |||
|
266 | break; | |||
|
267 | case EM_MMA: | |||
|
268 | machineName = " Fujitsu MMA Multimedia Accelerator"; | |||
|
269 | break; | |||
|
270 | case EM_PCP: | |||
|
271 | machineName = " Siemens PCP "; | |||
|
272 | break; | |||
|
273 | case EM_NCPU: | |||
|
274 | machineName = " Sony nCPU embeeded RISC "; | |||
|
275 | break; | |||
|
276 | case EM_NDR1: | |||
|
277 | machineName = " Denso NDR1 microprocessor "; | |||
|
278 | break; | |||
|
279 | case EM_STARCORE: | |||
|
280 | machineName = " Motorola Start*Core processor "; | |||
|
281 | break; | |||
|
282 | case EM_ME16: | |||
|
283 | machineName = " Toyota ME16 processor "; | |||
|
284 | break; | |||
|
285 | case EM_ST100: | |||
|
286 | machineName = " STMicroelectronic ST100 processor "; | |||
|
287 | break; | |||
|
288 | case EM_TINYJ: | |||
|
289 | machineName = " Advanced Logic Corp. Tinyj emb.fam"; | |||
|
290 | break; | |||
|
291 | case EM_X86_64: | |||
|
292 | machineName = " AMD x86-64 architecture "; | |||
|
293 | break; | |||
|
294 | case EM_PDSP: | |||
|
295 | machineName = " Sony DSP Processor "; | |||
|
296 | break; | |||
|
297 | case EM_FX66: | |||
|
298 | machineName = " Siemens FX66 microcontroller "; | |||
|
299 | break; | |||
|
300 | case EM_ST9PLUS: | |||
|
301 | machineName = " STMicroelectronics ST9+ 8/16 mc "; | |||
|
302 | break; | |||
|
303 | case EM_ST7: | |||
|
304 | machineName = " STmicroelectronics ST7 8 bit mc "; | |||
|
305 | break; | |||
|
306 | case EM_68HC16: | |||
|
307 | machineName = " Motorola MC68HC16 microcontroller "; | |||
|
308 | break; | |||
|
309 | case EM_68HC11: | |||
|
310 | machineName = " Motorola MC68HC11 microcontroller "; | |||
|
311 | break; | |||
|
312 | case EM_68HC08: | |||
|
313 | machineName = " Motorola MC68HC08 microcontroller "; | |||
|
314 | break; | |||
|
315 | case EM_68HC05: | |||
|
316 | machineName = " Motorola MC68HC05 microcontroller "; | |||
|
317 | break; | |||
|
318 | case EM_SVX: | |||
|
319 | machineName = " Silicon Graphics SVx "; | |||
|
320 | break; | |||
|
321 | case EM_ST19: | |||
|
322 | machineName = " STMicroelectronics ST19 8 bit mc "; | |||
|
323 | break; | |||
|
324 | case EM_VAX: | |||
|
325 | machineName = " Digital VAX "; | |||
|
326 | break; | |||
|
327 | case EM_CRIS: | |||
|
328 | machineName = " Axis Communications 32-bit embedded processor "; | |||
|
329 | break; | |||
|
330 | case EM_JAVELIN: | |||
|
331 | machineName = " Infineon Technologies 32-bit embedded processor "; | |||
|
332 | break; | |||
|
333 | case EM_FIREPATH: | |||
|
334 | machineName = " Element 14 64-bit DSP Processor "; | |||
|
335 | break; | |||
|
336 | case EM_ZSP: | |||
|
337 | machineName = " LSI Logic 16-bit DSP Processor "; | |||
|
338 | break; | |||
|
339 | case EM_MMIX: | |||
|
340 | machineName = " Donald Knuth's educational 64-bit processor "; | |||
|
341 | break; | |||
|
342 | case EM_HUANY: | |||
|
343 | machineName = " Harvard University machine-independent object files "; | |||
|
344 | break; | |||
|
345 | case EM_PRISM: | |||
|
346 | machineName = " SiTera Prism "; | |||
|
347 | break; | |||
|
348 | case EM_AVR: | |||
|
349 | machineName = " Atmel AVR 8-bit microcontroller "; | |||
|
350 | break; | |||
|
351 | case EM_FR30: | |||
|
352 | machineName = " Fujitsu FR30 "; | |||
|
353 | break; | |||
|
354 | case EM_D10V: | |||
|
355 | machineName = " Mitsubishi D10V "; | |||
|
356 | break; | |||
|
357 | case EM_D30V: | |||
|
358 | machineName = " Mitsubishi D30V "; | |||
|
359 | break; | |||
|
360 | case EM_V850: | |||
|
361 | machineName = " NEC v850 "; | |||
|
362 | break; | |||
|
363 | case EM_M32R: | |||
|
364 | machineName = " Mitsubishi M32R "; | |||
|
365 | break; | |||
|
366 | case EM_MN10300: | |||
|
367 | machineName = " Matsushita MN10300 "; | |||
|
368 | break; | |||
|
369 | case EM_MN10200: | |||
|
370 | machineName = " Matsushita MN10200 "; | |||
|
371 | break; | |||
|
372 | case EM_PJ: | |||
|
373 | machineName = " picoJava "; | |||
|
374 | break; | |||
|
375 | case EM_OPENRISC: | |||
|
376 | machineName = " OpenRISC 32-bit embedded processor "; | |||
|
377 | break; | |||
|
378 | case EM_ARC_A5: | |||
|
379 | machineName = " ARC Cores Tangent-A5 "; | |||
|
380 | break; | |||
|
381 | case EM_XTENSA: | |||
|
382 | machineName = " Tensilica Xtensa Architecture "; | |||
|
383 | break; | |||
|
384 | case EM_AARCH64: | |||
|
385 | machineName = " ARM AARCH64 "; | |||
|
386 | break; | |||
|
387 | case EM_TILEPRO: | |||
|
388 | machineName = " Tilera TILEPro "; | |||
|
389 | break; | |||
|
390 | case EM_MICROBLAZE: | |||
|
391 | machineName = " Xilinx MicroBlaze "; | |||
|
392 | break; | |||
|
393 | case EM_TILEGX: | |||
|
394 | machineName = " Tilera TILE-Gx "; | |||
|
395 | break; | |||
|
396 | case EM_NUM: | |||
|
397 | machineName = ""; | |||
|
398 | break; | |||
|
399 | default: | |||
|
400 | machineName ="Unknow Machine"; | |||
|
401 | break; | |||
|
402 | } | |||
|
403 | return machineName; | |||
|
404 | } | |||
|
405 | ||||
|
406 | ||||
|
407 | ||||
|
408 | ||||
|
409 | QString ElfFile::getClass() | |||
|
410 | { | |||
|
411 | if(this->e!=NULL) | |||
|
412 | { | |||
|
413 | int eclass = gelf_getclass(this->e); | |||
|
414 | if(eclass==ELFCLASS32)return "ELF32"; | |||
|
415 | if(eclass==ELFCLASS64)return "ELF64"; | |||
|
416 | } | |||
|
417 | return "none"; | |||
|
418 | } | |||
|
419 | ||||
|
420 | ||||
|
421 | bool ElfFile::iself() | |||
|
422 | { | |||
|
423 | return (this->getType()!="Unknow"); | |||
|
424 | } | |||
|
425 | ||||
|
426 | QString ElfFile::getArchitecture() | |||
|
427 | { | |||
|
428 | if(this->e!=NULL) | |||
|
429 | { | |||
|
430 | return elfresolveMachine(this->ehdr.e_machine); | |||
|
431 | } | |||
|
432 | return ""; | |||
|
433 | } | |||
|
434 | ||||
|
435 | ||||
|
436 | QString ElfFile::getType() | |||
|
437 | { | |||
|
438 | QString kind(""); | |||
|
439 | if(this->e!=NULL) | |||
|
440 | { | |||
|
441 | switch(this->ek) | |||
|
442 | { | |||
|
443 | case ELF_K_AR: | |||
|
444 | kind = "Archive"; | |||
|
445 | break; | |||
|
446 | case ELF_K_ELF: | |||
|
447 | kind = "Elf"; | |||
|
448 | break; | |||
|
449 | case ELF_K_COFF: | |||
|
450 | kind = "COFF"; | |||
|
451 | break; | |||
|
452 | case ELF_K_NUM: | |||
|
453 | kind = "NUM"; | |||
|
454 | break; | |||
|
455 | case ELF_K_NONE: | |||
|
456 | kind = "Data"; | |||
|
457 | break; | |||
|
458 | default: | |||
|
459 | kind = "Unknow"; | |||
|
460 | break; | |||
|
461 | } | |||
|
462 | } | |||
|
463 | return kind; | |||
|
464 | } | |||
|
465 | ||||
|
466 | QString ElfFile::getEndianness() | |||
|
467 | { | |||
|
468 | if(this->e!=NULL) | |||
|
469 | { | |||
|
470 | if(this->ehdr.e_ident[EI_DATA]==ELFDATA2LSB)return "2's complement, little endian"; | |||
|
471 | if(this->ehdr.e_ident[EI_DATA]==ELFDATA2MSB)return "2's complement, big endian"; | |||
|
472 | } | |||
|
473 | return "none"; | |||
|
474 | } | |||
|
475 | ||||
|
476 | QString ElfFile::getABI() | |||
|
477 | { | |||
|
478 | if(this->e!=NULL) | |||
|
479 | { | |||
|
480 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_NONE)return "UNIX System V ABI"; | |||
|
481 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_SYSV)return "Alias"; | |||
|
482 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_HPUX)return "HP-UX"; | |||
|
483 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_NETBSD)return "NetBSD"; | |||
|
484 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_LINUX)return "Object uses GNU ELF extensions"; | |||
|
485 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_SOLARIS)return "Sun Solaris"; | |||
|
486 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_AIX)return "IBM AIX"; | |||
|
487 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_IRIX)return "SGI Irix"; | |||
|
488 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_FREEBSD)return "FreeBSD"; | |||
|
489 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_TRU64)return "Compaq TRU64 UNIX"; | |||
|
490 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_MODESTO)return " Novell Modesto"; | |||
|
491 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_OPENBSD)return "OpenBSD"; | |||
|
492 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_ARM_AEABI)return "ARM EABI"; | |||
|
493 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_ARM)return "ARM"; | |||
|
494 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_STANDALONE)return "Standalone (embedded) application"; | |||
|
495 | } | |||
|
496 | return "none"; | |||
|
497 | } | |||
|
498 | ||||
|
499 | ||||
|
500 | qint64 ElfFile::getVersion() | |||
|
501 | { | |||
|
502 | if(this->e!=NULL) | |||
|
503 | { | |||
|
504 | return this->ehdr.e_version; | |||
|
505 | } | |||
|
506 | return -1; | |||
|
507 | } | |||
|
508 | ||||
|
509 | qint64 ElfFile::getEntryPointAddress() | |||
|
510 | { | |||
|
511 | if(this->e!=NULL) | |||
|
512 | { | |||
|
513 | return this->ehdr.e_entry; | |||
|
514 | } | |||
|
515 | return -1; | |||
|
516 | } | |||
|
517 | ||||
|
518 | ||||
|
519 | int ElfFile::getSectionCount() | |||
|
520 | { | |||
|
521 | return (int)this->SectionCount; | |||
|
522 | } | |||
|
523 | ||||
|
524 | int ElfFile::getSymbolCount() | |||
|
525 | { | |||
|
526 | return (int)this->SymbolCount; | |||
|
527 | } | |||
|
528 | ||||
|
529 | ||||
|
530 | int ElfFile::getSegmentCount() | |||
|
531 | { | |||
|
532 | return (int)this->SegmentCount; | |||
|
533 | } | |||
|
534 | ||||
|
535 | ||||
|
536 | QString ElfFile::getSegmentType(int index) | |||
|
537 | { | |||
|
538 | QString type(""); | |||
|
539 | if(this->e!=NULL) | |||
|
540 | { | |||
|
541 | if(index < this->Segments.count()) | |||
|
542 | { | |||
|
543 | switch(this->Segments.at(index)->p_type) | |||
|
544 | { | |||
|
545 | case PT_NULL: | |||
|
546 | type = "Program header table entry unused"; | |||
|
547 | break; | |||
|
548 | case PT_LOAD: | |||
|
549 | type = "Loadable program segment"; | |||
|
550 | break; | |||
|
551 | case PT_DYNAMIC : | |||
|
552 | type = "Dynamic linking information"; | |||
|
553 | break; | |||
|
554 | case PT_INTERP: | |||
|
555 | type ="Program interpreter"; | |||
|
556 | break; | |||
|
557 | case PT_NOTE: | |||
|
558 | type = "Auxiliary information"; | |||
|
559 | break; | |||
|
560 | case PT_SHLIB: | |||
|
561 | type = "Reserved"; | |||
|
562 | break; | |||
|
563 | case PT_PHDR: | |||
|
564 | type = "Entry for header table itself"; | |||
|
565 | break; | |||
|
566 | case PT_TLS: | |||
|
567 | type = "Thread-local storage segment"; | |||
|
568 | break; | |||
|
569 | case PT_NUM: | |||
|
570 | type = "Number of defined types"; | |||
|
571 | break; | |||
|
572 | case PT_LOOS: | |||
|
573 | type = "Start of OS-specific"; | |||
|
574 | break; | |||
|
575 | case PT_SUNWSTACK: | |||
|
576 | type = "Stack segment"; | |||
|
577 | break; | |||
|
578 | case PT_LOPROC: | |||
|
579 | type = "Start of processor-specific"; | |||
|
580 | break; | |||
|
581 | case PT_HIPROC: | |||
|
582 | type = "End of processor-specific"; | |||
|
583 | break; | |||
|
584 | default: | |||
|
585 | type = "Unknow Section Type"; | |||
|
586 | break; | |||
|
587 | } | |||
|
588 | } | |||
|
589 | } | |||
|
590 | ||||
|
591 | return type; | |||
|
592 | } | |||
|
593 | ||||
|
594 | ||||
|
595 | qint64 ElfFile::getSegmentOffset(int index) | |||
|
596 | { | |||
|
597 | qint64 Offset = -1; | |||
|
598 | if(this->e!=NULL) | |||
|
599 | { | |||
|
600 | if(index < this->Segments.count()) | |||
|
601 | { | |||
|
602 | Offset = (qint64)this->Segments.at(index)->p_offset; | |||
|
603 | } | |||
|
604 | } | |||
|
605 | return Offset; | |||
|
606 | } | |||
|
607 | ||||
|
608 | ||||
|
609 | qint64 ElfFile::getSegmentVaddr(int index) | |||
|
610 | { | |||
|
611 | int64_t Vaddr = 0; | |||
|
612 | if(this->e!=NULL) | |||
|
613 | { | |||
|
614 | if(index < this->Segments.count()) | |||
|
615 | { | |||
|
616 | Vaddr = (int64_t)this->Segments.at(index)->p_vaddr; | |||
|
617 | } | |||
|
618 | } | |||
|
619 | return Vaddr; | |||
|
620 | } | |||
|
621 | ||||
|
622 | ||||
|
623 | qint64 ElfFile::getSegmentPaddr(int index) | |||
|
624 | { | |||
|
625 | int64_t Paddr=0; | |||
|
626 | if(this->e!=NULL) | |||
|
627 | { | |||
|
628 | if(index < this->Segments.count()) | |||
|
629 | { | |||
|
630 | Paddr = (int64_t)this->Segments.at(index)->p_paddr; | |||
|
631 | } | |||
|
632 | } | |||
|
633 | return Paddr; | |||
|
634 | } | |||
|
635 | ||||
|
636 | qint64 ElfFile::getSectionPaddr(int index) | |||
|
637 | { | |||
|
638 | int64_t Paddr=0; | |||
|
639 | if(this->e!=NULL) | |||
|
640 | { | |||
|
641 | if(index < this->sections.count()) | |||
|
642 | { | |||
|
643 | Paddr = (int64_t)this->sections.at(index)->section_header->sh_addr; | |||
|
644 | } | |||
|
645 | } | |||
|
646 | return Paddr; | |||
|
647 | } | |||
|
648 | ||||
|
649 | ||||
|
650 | qint64 ElfFile::getSegmentFilesz(int index) | |||
|
651 | { | |||
|
652 | int64_t FileSz=0; | |||
|
653 | if(this->e!=NULL) | |||
|
654 | { | |||
|
655 | if(index < this->Segments.count()) | |||
|
656 | { | |||
|
657 | FileSz = (int64_t)this->Segments.at(index)->p_filesz; | |||
|
658 | } | |||
|
659 | } | |||
|
660 | return FileSz; | |||
|
661 | } | |||
|
662 | ||||
|
663 | qint64 ElfFile::getSectionDatasz(int index) | |||
|
664 | { | |||
|
665 | int64_t DataSz=0; | |||
|
666 | if(this->e!=NULL) | |||
|
667 | { | |||
|
668 | if(index < this->sections.count()) | |||
|
669 | { | |||
|
670 | if(this->sections.at(index)->section_header->sh_type==SHT_NOBITS) | |||
|
671 | { | |||
|
672 | DataSz=0; | |||
|
673 | } | |||
|
674 | else | |||
|
675 | { | |||
|
676 | DataSz = (int64_t)this->sections.at(index)->data->d_size; | |||
|
677 | } | |||
|
678 | } | |||
|
679 | } | |||
|
680 | return DataSz; | |||
|
681 | } | |||
|
682 | ||||
|
683 | bool ElfFile::getSectionData(int index, char **buffer) | |||
|
684 | { | |||
|
685 | if(this->e!=NULL) | |||
|
686 | { | |||
|
687 | if(index < this->sections.count()) | |||
|
688 | { | |||
|
689 | *buffer = (char *)malloc(this->sections.at(index)->data->d_size); | |||
|
690 | memcpy(*buffer,this->sections.at(index)->data->d_buf,this->sections.at(index)->data->d_size); | |||
|
691 | return true; | |||
|
692 | } | |||
|
693 | } | |||
|
694 | return false; | |||
|
695 | } | |||
|
696 | ||||
|
697 | ||||
|
698 | qint64 ElfFile::getSegmentMemsz(int index) | |||
|
699 | { | |||
|
700 | int64_t MemSz=0; | |||
|
701 | if(this->e!=NULL) | |||
|
702 | { | |||
|
703 | if(index < this->Segments.count()) | |||
|
704 | { | |||
|
705 | MemSz = (int64_t)this->Segments.at(index)->p_memsz; | |||
|
706 | } | |||
|
707 | } | |||
|
708 | return MemSz; | |||
|
709 | } | |||
|
710 | ||||
|
711 | qint64 ElfFile::getSectionMemsz(int index) | |||
|
712 | { | |||
|
713 | int64_t MemSz=0; | |||
|
714 | if(this->e!=NULL) | |||
|
715 | { | |||
|
716 | if(index < this->sections.count()) | |||
|
717 | { | |||
|
718 | MemSz = (int64_t)this->sections.at(index)->section_header->sh_size; | |||
|
719 | } | |||
|
720 | } | |||
|
721 | return MemSz; | |||
|
722 | } | |||
|
723 | ||||
|
724 | ||||
|
725 | QString ElfFile::getSegmentFlags(int index) | |||
|
726 | { | |||
|
727 | QString flags(""); | |||
|
728 | if(this->e!=NULL) | |||
|
729 | { | |||
|
730 | if(index < this->Segments.count()) | |||
|
731 | { | |||
|
732 | if((this->Segments.at(index)->p_flags&PF_X) == PF_X)flags+="x"; | |||
|
733 | if((this->Segments.at(index)->p_flags&PF_W) == PF_W)flags+="w"; | |||
|
734 | if((this->Segments.at(index)->p_flags&PF_R) == PF_R)flags+="r"; | |||
|
735 | if((this->Segments.at(index)->p_flags&PF_MASKOS) == PF_MASKOS)flags+=" OS-specific"; | |||
|
736 | if((this->Segments.at(index)->p_flags&PF_MASKPROC) == PF_MASKPROC)flags+=" Processor-specific"; | |||
|
737 | } | |||
|
738 | } | |||
|
739 | return flags; | |||
|
740 | } | |||
|
741 | ||||
|
742 | ||||
|
743 | QString ElfFile::getSectionName(int index) | |||
|
744 | { | |||
|
745 | if((index<sections.count()) && (index>=0)) | |||
|
746 | { | |||
|
747 | char* nameChr = elf_strptr(this->e , this->shstrndx , this->sections.at(index)->section_header->sh_name); | |||
|
748 | return QString(nameChr); | |||
|
749 | } | |||
|
750 | return ""; | |||
|
751 | } | |||
|
752 | ||||
|
753 | ||||
|
754 | void ElfFile::updateSections() | |||
|
755 | { | |||
|
756 | for(int i=0;i<this->sections.count();i++) | |||
|
757 | { | |||
|
758 | delete this->sections.at(i); | |||
|
759 | } | |||
|
760 | this->sections.clear(); | |||
|
761 | this->scn = elf_nextscn (this->e , NULL ); | |||
|
762 | this->SectionCount = 0; | |||
|
763 | while( this->scn != NULL ) | |||
|
764 | { | |||
|
765 | GElf_Shdr* shdr = (GElf_Shdr*)malloc(sizeof(GElf_Shdr)); | |||
|
766 | gelf_getshdr ( this->scn , shdr ); | |||
|
767 | Elf_Data* data = elf_getdata(this->scn, NULL); | |||
|
768 | this->sections.append(new Elf_Section(data,shdr)); | |||
|
769 | this->SectionCount+=1; | |||
|
770 | this->scn = elf_nextscn(e , scn); | |||
|
771 | } | |||
|
772 | } | |||
|
773 | ||||
|
774 | ||||
|
775 | void ElfFile::updateSegments() | |||
|
776 | { | |||
|
777 | elf_getphdrnum (this->e , &this->SegmentCount); | |||
|
778 | for(int i=0;i<this->Segments.count();i++) | |||
|
779 | { | |||
|
780 | free(this->Segments.at(i)); | |||
|
781 | } | |||
|
782 | this->Segments.clear(); | |||
|
783 | for(int i=0;i<(int)this->SegmentCount;i++) | |||
|
784 | { | |||
|
785 | GElf_Phdr* header=(GElf_Phdr*)malloc(sizeof(GElf_Phdr)); | |||
|
786 | gelf_getphdr (this->e , i , header ); | |||
|
787 | this->Segments.append(header); | |||
|
788 | } | |||
|
789 | } | |||
|
790 | ||||
|
791 | void ElfFile::updateSymbols() | |||
|
792 | { | |||
|
793 | for(int i=0;i<symbols.count();i++) | |||
|
794 | { | |||
|
795 | delete this->symbols.at(i); | |||
|
796 | } | |||
|
797 | this->symbols.clear(); | |||
|
798 | updateSections(); //Useless in most case but safer to do it | |||
|
799 | for(int i=0;i<(int)SectionCount;i++) | |||
|
800 | { | |||
|
801 | //First find Symbol table | |||
|
802 | if(this->getSectionName(i)==".symtab") | |||
|
803 | { | |||
|
804 | Elf_Section* sec = sections.at(i); | |||
|
805 | this->SymbolCount = sec->section_header->sh_size / sec->section_header->sh_entsize; | |||
|
806 | //Then list all symbols | |||
|
807 | for(int j=0;j<(int)this->SymbolCount;j++) | |||
|
808 | { | |||
|
809 | GElf_Sym* esym = (GElf_Sym*)malloc(sizeof(GElf_Sym)); | |||
|
810 | gelf_getsym(sec->data, j, esym); | |||
|
811 | QString name = elf_strptr(this->e,sec->section_header->sh_link,esym->st_name); | |||
|
812 | Elf_Symbol* sym = new Elf_Symbol(name,esym); | |||
|
813 | symbols.append(sym); | |||
|
814 | } | |||
|
815 | } | |||
|
816 | } | |||
|
817 | ||||
|
818 | } | |||
|
819 | ||||
|
820 | ||||
|
821 | ||||
|
822 | QString ElfFile::getSectionType(int index) | |||
|
823 | { | |||
|
824 | QString type(""); | |||
|
825 | if(this->e!=NULL) | |||
|
826 | { | |||
|
827 | if(index < this->sections.count()) | |||
|
828 | { | |||
|
829 | switch(this->sections.at(index)->section_header->sh_type) | |||
|
830 | { | |||
|
831 | case SHT_NULL : type = "Section header table entry unused"; break; | |||
|
832 | case SHT_PROGBITS : type = "Program data"; break; | |||
|
833 | case SHT_SYMTAB : type = "Symbol table"; break; | |||
|
834 | case SHT_STRTAB : type = "String table"; break; | |||
|
835 | case SHT_RELA : type = "Relocation entries with addends"; break; | |||
|
836 | case SHT_HASH : type = "Symbol hash table"; break; | |||
|
837 | case SHT_DYNAMIC : type = "Dynamic linking information"; break; | |||
|
838 | case SHT_NOTE : type = "Notes"; break; | |||
|
839 | case SHT_NOBITS :type = "Program space with no data (bss)"; break; | |||
|
840 | case SHT_REL :type = "Relocation entries, no addends"; break; | |||
|
841 | case SHT_SHLIB : type = "Reserved"; break; | |||
|
842 | case SHT_DYNSYM : type = "Dynamic linker symbol table"; break; | |||
|
843 | case SHT_INIT_ARRAY : type = "Array of constructors"; break; | |||
|
844 | case SHT_FINI_ARRAY : type = "Array of destructors"; break; | |||
|
845 | case SHT_PREINIT_ARRAY : type = "Array of pre-constructors"; break; | |||
|
846 | case SHT_GROUP : type = "Section group"; break; | |||
|
847 | case SHT_SYMTAB_SHNDX : type = "Extended section indeces"; break; | |||
|
848 | case SHT_NUM : type = "Number of defined types. "; break; | |||
|
849 | case SHT_LOOS : type = "Start OS-specific. "; break; | |||
|
850 | case SHT_LOSUNW : type = "Sun-specific low bound. "; break; | |||
|
851 | case SHT_SUNW_COMDAT : type = " "; break; | |||
|
852 | case SHT_SUNW_syminfo : type = " "; break; | |||
|
853 | case SHT_GNU_verdef : type = "Version definition section. "; break; | |||
|
854 | case SHT_GNU_verneed : type = "Version needs section. "; break; | |||
|
855 | case SHT_GNU_versym : type = "Version symbol table. "; break; | |||
|
856 | case SHT_LOPROC : type = "Start of processor-specific"; break; | |||
|
857 | case SHT_HIPROC : type = "End of processor-specific"; break; | |||
|
858 | case SHT_HIUSER : type = "End of application-specific"; break; | |||
|
859 | } | |||
|
860 | } | |||
|
861 | } | |||
|
862 | return type; | |||
|
863 | } | |||
|
864 | ||||
|
865 | int ElfFile::getSectionIndex(QString name) | |||
|
866 | { | |||
|
867 | if(this->e!=NULL) | |||
|
868 | { | |||
|
869 | for(int i=0;i<sections.count();i++) | |||
|
870 | { | |||
|
871 | if(getSectionName(i)==name) | |||
|
872 | return i; | |||
|
873 | } | |||
|
874 | } | |||
|
875 | return -1; | |||
|
876 | } | |||
|
877 | ||||
|
878 | bool ElfFile::sectionIsNobits(int index) | |||
|
879 | { | |||
|
880 | if(this->e!=NULL) | |||
|
881 | { | |||
|
882 | if(index < this->sections.count()) | |||
|
883 | { | |||
|
884 | return this->sections.at(index)->section_header->sh_type== SHT_NOBITS; | |||
|
885 | } | |||
|
886 | } | |||
|
887 | return false; | |||
|
888 | } | |||
|
889 | ||||
|
890 | QString ElfFile::getSymbolName(int index) | |||
|
891 | { | |||
|
892 | if(this->e!=NULL) | |||
|
893 | { | |||
|
894 | if(index < this->symbols.count()) | |||
|
895 | { | |||
|
896 | return symbols.at(index)->name; | |||
|
897 | } | |||
|
898 | } | |||
|
899 | return ""; | |||
|
900 | } | |||
|
901 | ||||
|
902 | QString ElfFile::getSymbolType(int index) | |||
|
903 | { | |||
|
904 | if(this->e!=NULL) | |||
|
905 | { | |||
|
906 | if(index < this->symbols.count()) | |||
|
907 | { | |||
|
908 | int type = GELF_ST_TYPE(symbols.at(index)->sym->st_info); | |||
|
909 | switch(type) | |||
|
910 | { | |||
|
911 | case STT_NOTYPE: | |||
|
912 | return "No Type"; | |||
|
913 | break; | |||
|
914 | case STT_OBJECT: | |||
|
915 | return "Object"; | |||
|
916 | break; | |||
|
917 | case STT_FUNC: | |||
|
918 | return "Function"; | |||
|
919 | break; | |||
|
920 | case STT_SECTION: | |||
|
921 | return "Section"; | |||
|
922 | break; | |||
|
923 | case STT_FILE: | |||
|
924 | return "File"; | |||
|
925 | break; | |||
|
926 | case STT_COMMON: | |||
|
927 | return "Common data object"; | |||
|
928 | break; | |||
|
929 | case STT_TLS: | |||
|
930 | return "Thread-local data object"; | |||
|
931 | break; | |||
|
932 | case STT_NUM: | |||
|
933 | return "Number of defined types"; | |||
|
934 | break; | |||
|
935 | case STT_LOOS: | |||
|
936 | return "Start of OS-specific"; | |||
|
937 | break; | |||
|
938 | case STT_HIOS: | |||
|
939 | return "End of OS-specific"; | |||
|
940 | break; | |||
|
941 | case STT_LOPROC: | |||
|
942 | return "Start of processor-specific"; | |||
|
943 | break; | |||
|
944 | case STT_HIPROC: | |||
|
945 | return "End of processor-specific"; | |||
|
946 | break; | |||
|
947 | default: | |||
|
948 | return "none"; | |||
|
949 | break; | |||
|
950 | } | |||
|
951 | } | |||
|
952 | } | |||
|
953 | return "none"; | |||
|
954 | } | |||
|
955 | ||||
|
956 | quint64 ElfFile::getSymbolSize(int index) | |||
|
957 | { | |||
|
958 | if(this->e!=NULL) | |||
|
959 | { | |||
|
960 | if((index < this->symbols.count()) && (index>=0)) | |||
|
961 | { | |||
|
962 | return symbols.at(index)->sym->st_size; | |||
|
963 | } | |||
|
964 | } | |||
|
965 | return 0; | |||
|
966 | } | |||
|
967 | ||||
|
968 | QString ElfFile::getSymbolSectionName(int index) | |||
|
969 | { | |||
|
970 | if(this->e!=NULL) | |||
|
971 | { | |||
|
972 | if((index < this->symbols.count()) && (index>=0)) | |||
|
973 | { | |||
|
974 | return getSectionName(symbols.at(index)->sym->st_shndx-1); | |||
|
975 | } | |||
|
976 | } | |||
|
977 | return "none"; | |||
|
978 | } | |||
|
979 | ||||
|
980 | int ElfFile::getSymbolSectionIndex(int index) | |||
|
981 | { | |||
|
982 | if(this->e!=NULL) | |||
|
983 | { | |||
|
984 | if((index < this->symbols.count()) && (index>=0)) | |||
|
985 | { | |||
|
986 | return symbols.at(index)->sym->st_shndx; | |||
|
987 | } | |||
|
988 | } | |||
|
989 | return 0; | |||
|
990 | } | |||
|
991 | ||||
|
992 | quint64 ElfFile::getSymbolAddress(int index) | |||
|
993 | { | |||
|
994 | if(this->e!=NULL) | |||
|
995 | { | |||
|
996 | if((index < this->symbols.count()) && (index>=0)) | |||
|
997 | { | |||
|
998 | return symbols.at(index)->sym->st_value; | |||
|
999 | } | |||
|
1000 | } | |||
|
1001 | return 0; | |||
|
1002 | } | |||
|
1003 | ||||
|
1004 | QString ElfFile::getSymbolLinkType(int index) | |||
|
1005 | { | |||
|
1006 | if(this->e!=NULL) | |||
|
1007 | { | |||
|
1008 | if(index < this->symbols.count()) | |||
|
1009 | { | |||
|
1010 | int btype = GELF_ST_BIND(symbols.at(index)->sym->st_info); | |||
|
1011 | switch(btype) | |||
|
1012 | { | |||
|
1013 | case STB_LOCAL: | |||
|
1014 | return "Local"; | |||
|
1015 | break; | |||
|
1016 | case STB_GLOBAL: | |||
|
1017 | return "Global"; | |||
|
1018 | break; | |||
|
1019 | case STB_WEAK: | |||
|
1020 | return "Weak"; | |||
|
1021 | break; | |||
|
1022 | case STB_NUM: | |||
|
1023 | return "Number of defined types"; | |||
|
1024 | break; | |||
|
1025 | case STB_LOOS: | |||
|
1026 | return "Start of OS-specific"; | |||
|
1027 | break; | |||
|
1028 | case STB_HIOS: | |||
|
1029 | return "End of OS-specific"; | |||
|
1030 | break; | |||
|
1031 | case STB_LOPROC: | |||
|
1032 | return "Start of processor-specific"; | |||
|
1033 | break; | |||
|
1034 | case STB_HIPROC: | |||
|
1035 | return "End of processor-specific"; | |||
|
1036 | break; | |||
|
1037 | default: | |||
|
1038 | return "none"; | |||
|
1039 | break; | |||
|
1040 | } | |||
|
1041 | } | |||
|
1042 | } | |||
|
1043 | return "none"; | |||
|
1044 | } | |||
|
1045 | ||||
|
1046 | bool ElfFile::isElf(const QString &File) | |||
|
1047 | { | |||
|
1048 | int file =0; | |||
|
1049 | #ifdef _ELF_WINDOWS_ | |||
|
1050 | file = open(File.toStdString().c_str(),O_RDONLY|O_BINARY ,0); | |||
|
1051 | #else | |||
|
1052 | file = open(File.toStdString().c_str(),O_RDONLY ,0); | |||
|
1053 | #endif | |||
|
1054 | char Magic[4]; | |||
|
1055 | if(file!=-1) | |||
|
1056 | { | |||
|
1057 | size_t res = read(file,Magic,4); | |||
|
1058 | close(file); | |||
|
1059 | if((res==4) && (Magic[0]==0x7f) && (Magic[1]==0x45) && (Magic[2]==0x4c) && (Magic[3]==0x46)) | |||
|
1060 | { | |||
|
1061 | return true; | |||
|
1062 | } | |||
|
1063 | } | |||
|
1064 | return false; | |||
|
1065 | } | |||
|
1066 | ||||
|
1067 | bool ElfFile::toSrec(const QString &File) | |||
|
1068 | { | |||
|
1069 | return srecFile::toSrec(this->getFragments(),File); | |||
|
1070 | } | |||
|
1071 | ||||
|
1072 | bool ElfFile::toBinary(const QString &File) | |||
|
1073 | { | |||
|
1074 | return binaryFile::toBinary(getFragments(),File); | |||
|
1075 | } |
@@ -0,0 +1,136 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #include <abstractbinfile.h> | |||
|
23 | #include <QtCore/QObject> | |||
|
24 | #include <QtCore/QStringList> | |||
|
25 | #include <libelf.h> | |||
|
26 | #include <gelf.h> | |||
|
27 | #include <sys/types.h> | |||
|
28 | #include <sys/stat.h> | |||
|
29 | #include <fcntl.h> | |||
|
30 | #include <unistd.h> | |||
|
31 | #ifndef ELFFILE_H | |||
|
32 | #define ELFFILE_H | |||
|
33 | ||||
|
34 | class Elf_Section | |||
|
35 | { | |||
|
36 | public: | |||
|
37 | Elf_Section(){} | |||
|
38 | Elf_Section(Elf_Data* data,GElf_Shdr* section_header) | |||
|
39 | { | |||
|
40 | this->data = data; | |||
|
41 | this->section_header = section_header; | |||
|
42 | } | |||
|
43 | ~Elf_Section() | |||
|
44 | { | |||
|
45 | free(section_header); | |||
|
46 | } | |||
|
47 | Elf_Data* data; | |||
|
48 | GElf_Shdr* section_header; | |||
|
49 | }; | |||
|
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 | ||||
|
61 | class ElfFile : public abstractBinFile | |||
|
62 | { | |||
|
63 | Q_OBJECT | |||
|
64 | public: | |||
|
65 | ElfFile(); | |||
|
66 | ElfFile(const QString& File); | |||
|
67 | ~ElfFile(); | |||
|
68 | bool openFile(const QString& File); | |||
|
69 | bool isopened(); | |||
|
70 | int closeFile(); | |||
|
71 | QList<codeFragment*> getFragments(); | |||
|
72 | QList<codeFragment*> getFragments(QStringList fragmentList); | |||
|
73 | ||||
|
74 | QString getClass(); | |||
|
75 | QString getArchitecture(); | |||
|
76 | QString getType(); | |||
|
77 | QString getEndianness(); | |||
|
78 | QString getABI(); | |||
|
79 | qint64 getVersion(); | |||
|
80 | qint64 getEntryPointAddress(); | |||
|
81 | ||||
|
82 | int getSectionCount(); | |||
|
83 | int getSymbolCount(); | |||
|
84 | int getSegmentCount(); | |||
|
85 | ||||
|
86 | QString getSegmentType(int index); | |||
|
87 | qint64 getSegmentOffset(int index); | |||
|
88 | qint64 getSegmentVaddr(int index); | |||
|
89 | qint64 getSegmentPaddr(int index); | |||
|
90 | qint64 getSegmentFilesz(int index); | |||
|
91 | qint64 getSegmentMemsz(int index); | |||
|
92 | QString getSegmentFlags(int index); | |||
|
93 | ||||
|
94 | bool getSectionData(int index, char **buffer); | |||
|
95 | qint64 getSectionPaddr(int index); | |||
|
96 | qint64 getSectionMemsz(int index); | |||
|
97 | qint64 getSectionDatasz(int index); | |||
|
98 | QString getSectionName(int index); | |||
|
99 | QString getSectionType(int index); | |||
|
100 | int getSectionIndex(QString name); | |||
|
101 | bool sectionIsNobits(int index); | |||
|
102 | ||||
|
103 | QString getSymbolName(int index); | |||
|
104 | QString getSymbolType(int index); | |||
|
105 | quint64 getSymbolSize(int index); | |||
|
106 | QString getSymbolSectionName(int index); | |||
|
107 | int getSymbolSectionIndex(int index); | |||
|
108 | quint64 getSymbolAddress(int index); | |||
|
109 | QString getSymbolLinkType(int index); | |||
|
110 | bool iself(); | |||
|
111 | static bool isElf(const QString& File); | |||
|
112 | ||||
|
113 | bool toSrec(const QString& File); | |||
|
114 | bool toBinary(const QString& File); | |||
|
115 | ||||
|
116 | private: | |||
|
117 | codeFragment* getFragment(const QString& name); | |||
|
118 | void updateSections(); | |||
|
119 | void updateSegments(); | |||
|
120 | void updateSymbols(); | |||
|
121 | int elfFile; | |||
|
122 | bool opened; | |||
|
123 | bool type_elf; | |||
|
124 | Elf* e; | |||
|
125 | Elf_Kind ek; | |||
|
126 | GElf_Ehdr ehdr; | |||
|
127 | Elf_Scn * scn; | |||
|
128 | Elf_Data * data; | |||
|
129 | size_t SymbolCount,SectionCount,SegmentCount, shstrndx; | |||
|
130 | QList<GElf_Phdr*> Segments; | |||
|
131 | QList<Elf_Section*> sections; | |||
|
132 | QList<Elf_Symbol*> symbols; | |||
|
133 | ||||
|
134 | }; | |||
|
135 | ||||
|
136 | #endif // ELFFILE_H |
@@ -0,0 +1,346 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #include "elffilewidget.h" | |||
|
23 | #include "ui_elffilewidget.h" | |||
|
24 | #include <QtWidgets/QTableWidgetItem> | |||
|
25 | #include <QtWidgets/QFileDialog> | |||
|
26 | #include "qhexedit.h" | |||
|
27 | #include "qtablewidgetintitem.h" | |||
|
28 | #include "../srec/srecfile.h" | |||
|
29 | #include "../BinFile/binaryfile.h" | |||
|
30 | ||||
|
31 | elfFileWidget::elfFileWidget(QWidget *parent) : | |||
|
32 | abstractBinFileWidget(parent), | |||
|
33 | ui(new Ui::elfFileWidget) | |||
|
34 | { | |||
|
35 | ui->setupUi(this); | |||
|
36 | exportToSREC_action = new QAction(tr("Export to SREC"),this); | |||
|
37 | exportToBIN_action = new QAction(tr("Export to Binary"),this); | |||
|
38 | viewSymbolInHexViewer_action = new QAction(tr("View in Hexviewer"),this); | |||
|
39 | connect(this->ui->sectionsList,SIGNAL(cellActivated(int,int)),this,SLOT(sectionCellActivated(int,int))); | |||
|
40 | this->ui->sectionsList->addAction(exportToSREC_action); | |||
|
41 | this->ui->sectionsList->addAction(exportToBIN_action); | |||
|
42 | this->ui->symbolsList->addAction(viewSymbolInHexViewer_action); | |||
|
43 | this->ui->symbolsList->addAction(exportToSREC_action); | |||
|
44 | this->ui->symbolsList->addAction(exportToBIN_action); | |||
|
45 | connect(this->exportToBIN_action,SIGNAL(triggered()),this,SLOT(exportToBIN())); | |||
|
46 | connect(this->exportToSREC_action,SIGNAL(triggered()),this,SLOT(exportToSREC())); | |||
|
47 | connect(this->ui->symbolsFilter,SIGNAL(textChanged(QString)),this,SLOT(filterSymbols(QString))); | |||
|
48 | connect(this->ui->caseSensitive,SIGNAL(toggled(bool)),this,SLOT(filterSymbolsCaseUpdate(bool))); | |||
|
49 | connect(this->viewSymbolInHexViewer_action,SIGNAL(triggered()),this,SLOT(viewSymbolInHexViewer())); | |||
|
50 | this->p_hexviewer = new QHexEdit(); | |||
|
51 | this->p_hexviewer->setWindowTitle("SocExplorer Hexadecimal viewer"); | |||
|
52 | this->setWindowTitle("SocExplorer Elf viewer"); | |||
|
53 | } | |||
|
54 | ||||
|
55 | ||||
|
56 | ||||
|
57 | elfFileWidget::~elfFileWidget() | |||
|
58 | { | |||
|
59 | delete ui; | |||
|
60 | delete p_hexviewer; | |||
|
61 | } | |||
|
62 | ||||
|
63 | ||||
|
64 | ||||
|
65 | void elfFileWidget::setFile(ElfFile *file) | |||
|
66 | { | |||
|
67 | this->p_elf = file; | |||
|
68 | if(p_elf->isopened() && p_elf->iself()) | |||
|
69 | { | |||
|
70 | this->ui->classLabel->setText(p_elf->getClass()); | |||
|
71 | this->ui->VersionLabel->setText(QString::number(p_elf->getVersion())); | |||
|
72 | this->ui->machineLabel->setText(p_elf->getArchitecture()); | |||
|
73 | this->ui->endiannesLabel->setText(p_elf->getEndianness()); | |||
|
74 | this->ui->abiLabel->setText(p_elf->getABI()); | |||
|
75 | this->ui->entryPointLabel->setText(QString("0x%1").arg((uint)p_elf->getEntryPointAddress(),8,16)); | |||
|
76 | this->ui->typeLabel->setText(p_elf->getType()); | |||
|
77 | this->ui->sectionCountLabel->setText(QString::number(p_elf->getSectionCount())); | |||
|
78 | this->ui->symbolCountLabel->setText(QString::number(p_elf->getSymbolCount())); | |||
|
79 | } | |||
|
80 | reloadFile(); | |||
|
81 | } | |||
|
82 | ||||
|
83 | void elfFileWidget::reloadFile() | |||
|
84 | { | |||
|
85 | updateSymbols(); | |||
|
86 | updateSections(); | |||
|
87 | } | |||
|
88 | ||||
|
89 | ||||
|
90 | ||||
|
91 | void elfFileWidget::updateSymbols() | |||
|
92 | { | |||
|
93 | this->ui->symbolsList->clear(); | |||
|
94 | this->ui->symbolsList->setRowCount(p_elf->getSymbolCount()); | |||
|
95 | this->ui->symbolsList->setHorizontalHeaderLabels(QStringList()<<"Index"<<"Value"<<"Size"<<"Type"<<"Link"<<"Section"<<"Name"); | |||
|
96 | for(int i=0;i<p_elf->getSymbolCount();i++) | |||
|
97 | { | |||
|
98 | QTableWidgetItem *newItem = (QTableWidgetItem*)new QTableWidgetIntItem(QString("%1").arg(i),DecimalItem); | |||
|
99 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
100 | this->ui->symbolsList->setItem(i, 0, newItem); | |||
|
101 | ||||
|
102 | newItem = (QTableWidgetItem*)new QTableWidgetIntItem(QString("0x%1").arg(p_elf->getSymbolAddress(i),8,16).replace(" ","0"),HexaDecimalItem); | |||
|
103 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
104 | this->ui->symbolsList->setItem(i, 1, newItem); | |||
|
105 | ||||
|
106 | newItem = (QTableWidgetItem*)new QTableWidgetIntItem(QString("%1").arg(p_elf->getSymbolSize(i)),DecimalItem); | |||
|
107 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
108 | this->ui->symbolsList->setItem(i, 2, newItem); | |||
|
109 | ||||
|
110 | newItem = new QTableWidgetItem(p_elf->getSymbolType(i)); | |||
|
111 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
112 | this->ui->symbolsList->setItem(i, 3, newItem); | |||
|
113 | ||||
|
114 | newItem = new QTableWidgetItem(p_elf->getSymbolLinkType(i)); | |||
|
115 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
116 | this->ui->symbolsList->setItem(i, 4, newItem); | |||
|
117 | ||||
|
118 | newItem = new QTableWidgetItem(p_elf->getSymbolSectionName(i)); | |||
|
119 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
120 | this->ui->symbolsList->setItem(i, 5, newItem); | |||
|
121 | ||||
|
122 | newItem = new QTableWidgetItem(p_elf->getSymbolName(i)); | |||
|
123 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
124 | this->ui->symbolsList->setItem(i, 6, newItem); | |||
|
125 | } | |||
|
126 | this->ui->symbolsList->resizeColumnsToContents(); | |||
|
127 | } | |||
|
128 | ||||
|
129 | ||||
|
130 | ||||
|
131 | void elfFileWidget::updateSections() | |||
|
132 | { | |||
|
133 | this->ui->sectionsList->clear(); | |||
|
134 | this->ui->sectionsList->setRowCount(p_elf->getSectionCount()); | |||
|
135 | this->ui->sectionsList->setHorizontalHeaderLabels(QStringList()<<"Index"<<"Name"<<"Address"<<"Size"<<"File Size"<<"Type"); | |||
|
136 | for(int i=0;i<p_elf->getSectionCount();i++) | |||
|
137 | { | |||
|
138 | QTableWidgetItem *newItem = (QTableWidgetItem*) new QTableWidgetIntItem(QString("%1").arg(i),DecimalItem); | |||
|
139 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
140 | this->ui->sectionsList->setItem(i,0, newItem); | |||
|
141 | ||||
|
142 | newItem = new QTableWidgetItem(p_elf->getSectionName(i)); | |||
|
143 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
144 | this->ui->sectionsList->setItem(i, 1, newItem); | |||
|
145 | ||||
|
146 | newItem = (QTableWidgetItem*) new QTableWidgetIntItem(QString("0x%1").arg(p_elf->getSectionPaddr(i),8,16).replace(" ","0"),HexaDecimalItem); | |||
|
147 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
148 | this->ui->sectionsList->setItem(i, 2, newItem); | |||
|
149 | ||||
|
150 | newItem = (QTableWidgetItem*) new QTableWidgetIntItem(QString("%1").arg(p_elf->getSectionMemsz(i)),DecimalItem); | |||
|
151 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
152 | this->ui->sectionsList->setItem(i, 3, newItem); | |||
|
153 | ||||
|
154 | newItem = (QTableWidgetItem*) new QTableWidgetIntItem(QString("%1").arg(p_elf->getSectionDatasz(i)),DecimalItem); | |||
|
155 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
156 | this->ui->sectionsList->setItem(i, 4, newItem); | |||
|
157 | ||||
|
158 | newItem = new QTableWidgetItem(p_elf->getSectionType(i)); | |||
|
159 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
160 | this->ui->sectionsList->setItem(i, 5, newItem); | |||
|
161 | } | |||
|
162 | this->ui->sectionsList->resizeColumnsToContents(); | |||
|
163 | } | |||
|
164 | ||||
|
165 | void elfFileWidget::sectionCellActivated(int row, int column) | |||
|
166 | { | |||
|
167 | Q_UNUSED(column) | |||
|
168 | char* buff=NULL; | |||
|
169 | int sectionIndex = p_elf->getSectionIndex(this->ui->sectionsList->item(row,1)->text()); | |||
|
170 | if(sectionIndex!=-1) | |||
|
171 | { | |||
|
172 | QString type = p_elf->getSectionType(sectionIndex); | |||
|
173 | if(!p_elf->sectionIsNobits(sectionIndex)) | |||
|
174 | { | |||
|
175 | this->p_elf->getSectionData(sectionIndex,&buff); | |||
|
176 | this->ui->sectionsHexView->setData(QByteArray(buff,this->p_elf->getSectionDatasz(sectionIndex))); | |||
|
177 | this->ui->sectionsHexView->setAddressOffset(this->p_elf->getSectionPaddr(sectionIndex)); | |||
|
178 | } | |||
|
179 | } | |||
|
180 | } | |||
|
181 | ||||
|
182 | void elfFileWidget::exportToSREC() | |||
|
183 | { | |||
|
184 | QList<codeFragment *> fragments; | |||
|
185 | if(this->ui->tabWidget->currentWidget()==this->ui->symbolsTab) | |||
|
186 | { | |||
|
187 | fragments = getSelectedSymbolsFragments(); | |||
|
188 | } | |||
|
189 | if(this->ui->tabWidget->currentWidget()==this->ui->sectionsTab) | |||
|
190 | { | |||
|
191 | QStringList sectionList=getSelectedSectionsNames(); | |||
|
192 | if(sectionList.count()>0) | |||
|
193 | fragments = p_elf->getFragments(sectionList); | |||
|
194 | } | |||
|
195 | if(fragments.count()>0) | |||
|
196 | { | |||
|
197 | QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), | |||
|
198 | NULL, | |||
|
199 | tr("SREC Files (*.srec)")); | |||
|
200 | if(!fileName.isEmpty()) | |||
|
201 | { | |||
|
202 | srecFile::toSrec(fragments,fileName); | |||
|
203 | } | |||
|
204 | } | |||
|
205 | ||||
|
206 | } | |||
|
207 | ||||
|
208 | void elfFileWidget::exportToBIN() | |||
|
209 | { | |||
|
210 | QList<codeFragment *> fragments; | |||
|
211 | if(this->ui->tabWidget->currentWidget()==this->ui->symbolsTab) | |||
|
212 | { | |||
|
213 | fragments = getSelectedSymbolsFragments(); | |||
|
214 | } | |||
|
215 | if(this->ui->tabWidget->currentWidget()==this->ui->sectionsTab) | |||
|
216 | { | |||
|
217 | QStringList sectionList=getSelectedSectionsNames(); | |||
|
218 | if(sectionList.count()>0) | |||
|
219 | fragments = p_elf->getFragments(sectionList); | |||
|
220 | } | |||
|
221 | if(fragments.count()>0) | |||
|
222 | { | |||
|
223 | QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), | |||
|
224 | NULL, | |||
|
225 | tr("Binary Files (*.bin)")); | |||
|
226 | if(!fileName.isEmpty()) | |||
|
227 | { | |||
|
228 | binaryFile::toBinary(fragments,fileName); | |||
|
229 | } | |||
|
230 | } | |||
|
231 | ||||
|
232 | } | |||
|
233 | ||||
|
234 | void elfFileWidget::viewSymbolInHexViewer() | |||
|
235 | { | |||
|
236 | int row=this->ui->symbolsList->item(this->ui->symbolsList->currentRow(),0)->text().toInt(); | |||
|
237 | int section = p_elf->getSectionIndex(p_elf->getSymbolSectionName(row)); | |||
|
238 | qint64 address = p_elf->getSymbolAddress(row); | |||
|
239 | qint64 secAddress = p_elf->getSectionPaddr(section); | |||
|
240 | qint64 size = p_elf->getSymbolSize(row); | |||
|
241 | char* buff=NULL; | |||
|
242 | char* symBuff=NULL; | |||
|
243 | if(size && !p_elf->sectionIsNobits(section)) | |||
|
244 | { | |||
|
245 | if(section!=-1) | |||
|
246 | { | |||
|
247 | symBuff = (char*)malloc(size); | |||
|
248 | this->p_elf->getSectionData(section,&buff); | |||
|
249 | memcpy(symBuff,buff+(address-secAddress),size); | |||
|
250 | this->p_hexviewer->setData(QByteArray(symBuff,size)); | |||
|
251 | this->p_hexviewer->setAddressOffset(address); | |||
|
252 | this->p_hexviewer->show(); | |||
|
253 | } | |||
|
254 | } | |||
|
255 | } | |||
|
256 | ||||
|
257 | void elfFileWidget::filterSymbols(const QString &pattern) | |||
|
258 | { | |||
|
259 | Qt::MatchFlags flag = Qt::MatchContains | Qt::MatchStartsWith | Qt::MatchEndsWith | Qt::MatchRegExp | Qt::MatchWildcard | Qt::MatchWrap |Qt::MatchRecursive; | |||
|
260 | if(this->ui->caseSensitive->isChecked()) | |||
|
261 | flag |= Qt::MatchCaseSensitive; | |||
|
262 | if(pattern.isEmpty()) | |||
|
263 | { | |||
|
264 | for(int i=0;i<this->ui->symbolsList->rowCount();i++) | |||
|
265 | this->ui->symbolsList->setRowHidden(i,false); | |||
|
266 | } | |||
|
267 | else | |||
|
268 | { | |||
|
269 | for(int i=0;i<this->ui->symbolsList->rowCount();i++) | |||
|
270 | this->ui->symbolsList->setRowHidden(i,true); | |||
|
271 | QList<QTableWidgetItem*> items = this->ui->symbolsList->findItems(pattern,flag); | |||
|
272 | for(int i=0;i<items.count();i++) | |||
|
273 | this->ui->symbolsList->setRowHidden(items.at(i)->row(),false); | |||
|
274 | } | |||
|
275 | } | |||
|
276 | ||||
|
277 | void elfFileWidget::filterSymbolsCaseUpdate(bool toggled) | |||
|
278 | { | |||
|
279 | Q_UNUSED(toggled) | |||
|
280 | this->filterSymbols(this->ui->symbolsFilter->text()); | |||
|
281 | } | |||
|
282 | ||||
|
283 | QList<codeFragment *> elfFileWidget::getSelectedSymbolsFragments() | |||
|
284 | { | |||
|
285 | QList<codeFragment *> fragments; | |||
|
286 | codeFragment * fragment; | |||
|
287 | if(p_elf->isopened()) | |||
|
288 | { | |||
|
289 | QList<QTableWidgetItem*> items = this->ui->symbolsList->selectedItems(); | |||
|
290 | for(int i=0;i<items.count();i++) | |||
|
291 | { | |||
|
292 | int row=this->ui->symbolsList->item(items.at(i)->row(),0)->text().toInt(); | |||
|
293 | int section = p_elf->getSectionIndex(p_elf->getSymbolSectionName(row)); | |||
|
294 | qint64 address = p_elf->getSymbolAddress(row); | |||
|
295 | qint64 secAddress = p_elf->getSectionPaddr(section); | |||
|
296 | qint64 size = p_elf->getSymbolSize(row); | |||
|
297 | char* buff=NULL; | |||
|
298 | if(size && !p_elf->sectionIsNobits(section)) | |||
|
299 | { | |||
|
300 | if(section!=-1) | |||
|
301 | { | |||
|
302 | fragment= new codeFragment(); | |||
|
303 | fragment->data = (char*)malloc(size); | |||
|
304 | fragment->address = address; | |||
|
305 | fragment->size = size; | |||
|
306 | this->p_elf->getSectionData(section,&buff); | |||
|
307 | memcpy(fragment->data,buff+(address-secAddress),size); | |||
|
308 | fragments.append(fragment); | |||
|
309 | } | |||
|
310 | } | |||
|
311 | } | |||
|
312 | } | |||
|
313 | return fragments; | |||
|
314 | ||||
|
315 | } | |||
|
316 | ||||
|
317 | ||||
|
318 | ||||
|
319 | QStringList elfFileWidget::getSelectedSectionsNames() | |||
|
320 | { | |||
|
321 | QStringList sectionList; | |||
|
322 | QList<QTableWidgetItem*> items = this->ui->sectionsList->selectedItems(); | |||
|
323 | for(int i=0;i<items.count();i++) | |||
|
324 | { | |||
|
325 | QString section = p_elf->getSectionName(items.at(i)->row()); | |||
|
326 | if(!sectionList.contains(section)) | |||
|
327 | { | |||
|
328 | sectionList.append(section); | |||
|
329 | } | |||
|
330 | } | |||
|
331 | return sectionList; | |||
|
332 | } | |||
|
333 | ||||
|
334 | ||||
|
335 | ||||
|
336 | ||||
|
337 | ||||
|
338 | ||||
|
339 | ||||
|
340 | ||||
|
341 | ||||
|
342 | ||||
|
343 | ||||
|
344 | ||||
|
345 | ||||
|
346 |
@@ -0,0 +1,66 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #ifndef ELFFILEWIDGET_H | |||
|
23 | #define ELFFILEWIDGET_H | |||
|
24 | ||||
|
25 | #include <QtWidgets/QWidget> | |||
|
26 | #include "elffile.h" | |||
|
27 | #include <QtWidgets/QAction> | |||
|
28 | #include <qhexedit.h> | |||
|
29 | ||||
|
30 | namespace Ui { | |||
|
31 | class elfFileWidget; | |||
|
32 | } | |||
|
33 | ||||
|
34 | class elfFileWidget : public abstractBinFileWidget | |||
|
35 | { | |||
|
36 | Q_OBJECT | |||
|
37 | ||||
|
38 | public: | |||
|
39 | elfFileWidget(QWidget *parent = 0); | |||
|
40 | ~elfFileWidget(); | |||
|
41 | ||||
|
42 | public slots: | |||
|
43 | void setFile(ElfFile* file); | |||
|
44 | void reloadFile(); | |||
|
45 | void updateSymbols(); | |||
|
46 | void updateSections(); | |||
|
47 | ||||
|
48 | private slots: | |||
|
49 | void sectionCellActivated(int row, int column); | |||
|
50 | void exportToSREC(); | |||
|
51 | void exportToBIN(); | |||
|
52 | void viewSymbolInHexViewer(); | |||
|
53 | void filterSymbols(const QString& pattern); | |||
|
54 | void filterSymbolsCaseUpdate(bool toggled); | |||
|
55 | private: | |||
|
56 | QList<codeFragment*> getSelectedSymbolsFragments(); | |||
|
57 | Ui::elfFileWidget *ui; | |||
|
58 | QStringList getSelectedSectionsNames(); | |||
|
59 | ElfFile* p_elf; | |||
|
60 | QAction* exportToSREC_action; | |||
|
61 | QAction* exportToBIN_action; | |||
|
62 | QAction* viewSymbolInHexViewer_action; | |||
|
63 | QHexEdit* p_hexviewer; | |||
|
64 | }; | |||
|
65 | ||||
|
66 | #endif // ELFFILEWIDGET_H |
@@ -0,0 +1,337 | |||||
|
1 | <?xml version="1.0" encoding="UTF-8"?> | |||
|
2 | <ui version="4.0"> | |||
|
3 | <class>elfFileWidget</class> | |||
|
4 | <widget class="QWidget" name="elfFileWidget"> | |||
|
5 | <property name="geometry"> | |||
|
6 | <rect> | |||
|
7 | <x>0</x> | |||
|
8 | <y>0</y> | |||
|
9 | <width>786</width> | |||
|
10 | <height>387</height> | |||
|
11 | </rect> | |||
|
12 | </property> | |||
|
13 | <property name="minimumSize"> | |||
|
14 | <size> | |||
|
15 | <width>0</width> | |||
|
16 | <height>0</height> | |||
|
17 | </size> | |||
|
18 | </property> | |||
|
19 | <property name="focusPolicy"> | |||
|
20 | <enum>Qt::NoFocus</enum> | |||
|
21 | </property> | |||
|
22 | <property name="windowTitle"> | |||
|
23 | <string>Form</string> | |||
|
24 | </property> | |||
|
25 | <layout class="QGridLayout" name="gridLayout"> | |||
|
26 | <item row="0" column="0"> | |||
|
27 | <widget class="QTabWidget" name="tabWidget"> | |||
|
28 | <property name="currentIndex"> | |||
|
29 | <number>0</number> | |||
|
30 | </property> | |||
|
31 | <widget class="QWidget" name="generalInfoTab"> | |||
|
32 | <attribute name="title"> | |||
|
33 | <string>File Informations</string> | |||
|
34 | </attribute> | |||
|
35 | <layout class="QGridLayout" name="gridLayout_4"> | |||
|
36 | <item row="0" column="0"> | |||
|
37 | <widget class="QGroupBox" name="groupBox"> | |||
|
38 | <property name="title"> | |||
|
39 | <string>Elf header</string> | |||
|
40 | </property> | |||
|
41 | <layout class="QFormLayout" name="formLayout"> | |||
|
42 | <item row="0" column="0"> | |||
|
43 | <widget class="QLabel" name="label"> | |||
|
44 | <property name="text"> | |||
|
45 | <string>Class:</string> | |||
|
46 | </property> | |||
|
47 | </widget> | |||
|
48 | </item> | |||
|
49 | <item row="0" column="1"> | |||
|
50 | <widget class="QLabel" name="classLabel"> | |||
|
51 | <property name="text"> | |||
|
52 | <string>none</string> | |||
|
53 | </property> | |||
|
54 | </widget> | |||
|
55 | </item> | |||
|
56 | <item row="1" column="0"> | |||
|
57 | <widget class="QLabel" name="label_3"> | |||
|
58 | <property name="text"> | |||
|
59 | <string>Endianness:</string> | |||
|
60 | </property> | |||
|
61 | </widget> | |||
|
62 | </item> | |||
|
63 | <item row="1" column="1"> | |||
|
64 | <widget class="QLabel" name="endiannesLabel"> | |||
|
65 | <property name="text"> | |||
|
66 | <string>none</string> | |||
|
67 | </property> | |||
|
68 | </widget> | |||
|
69 | </item> | |||
|
70 | <item row="2" column="0"> | |||
|
71 | <widget class="QLabel" name="label_5"> | |||
|
72 | <property name="text"> | |||
|
73 | <string>Version:</string> | |||
|
74 | </property> | |||
|
75 | </widget> | |||
|
76 | </item> | |||
|
77 | <item row="3" column="0"> | |||
|
78 | <widget class="QLabel" name="label_6"> | |||
|
79 | <property name="text"> | |||
|
80 | <string>Type:</string> | |||
|
81 | </property> | |||
|
82 | </widget> | |||
|
83 | </item> | |||
|
84 | <item row="4" column="0"> | |||
|
85 | <widget class="QLabel" name="label_7"> | |||
|
86 | <property name="text"> | |||
|
87 | <string>Machine:</string> | |||
|
88 | </property> | |||
|
89 | </widget> | |||
|
90 | </item> | |||
|
91 | <item row="6" column="0"> | |||
|
92 | <widget class="QLabel" name="label_8"> | |||
|
93 | <property name="text"> | |||
|
94 | <string>Entry point address:</string> | |||
|
95 | </property> | |||
|
96 | </widget> | |||
|
97 | </item> | |||
|
98 | <item row="2" column="1"> | |||
|
99 | <widget class="QLabel" name="VersionLabel"> | |||
|
100 | <property name="text"> | |||
|
101 | <string>none</string> | |||
|
102 | </property> | |||
|
103 | </widget> | |||
|
104 | </item> | |||
|
105 | <item row="3" column="1"> | |||
|
106 | <widget class="QLabel" name="typeLabel"> | |||
|
107 | <property name="text"> | |||
|
108 | <string>none</string> | |||
|
109 | </property> | |||
|
110 | </widget> | |||
|
111 | </item> | |||
|
112 | <item row="4" column="1"> | |||
|
113 | <widget class="QLabel" name="machineLabel"> | |||
|
114 | <property name="text"> | |||
|
115 | <string>none</string> | |||
|
116 | </property> | |||
|
117 | </widget> | |||
|
118 | </item> | |||
|
119 | <item row="6" column="1"> | |||
|
120 | <widget class="QLabel" name="entryPointLabel"> | |||
|
121 | <property name="text"> | |||
|
122 | <string>none</string> | |||
|
123 | </property> | |||
|
124 | </widget> | |||
|
125 | </item> | |||
|
126 | <item row="5" column="0"> | |||
|
127 | <widget class="QLabel" name="label_17"> | |||
|
128 | <property name="text"> | |||
|
129 | <string>OS/ABI:</string> | |||
|
130 | </property> | |||
|
131 | </widget> | |||
|
132 | </item> | |||
|
133 | <item row="5" column="1"> | |||
|
134 | <widget class="QLabel" name="abiLabel"> | |||
|
135 | <property name="text"> | |||
|
136 | <string>none</string> | |||
|
137 | </property> | |||
|
138 | </widget> | |||
|
139 | </item> | |||
|
140 | </layout> | |||
|
141 | </widget> | |||
|
142 | </item> | |||
|
143 | <item row="1" column="0"> | |||
|
144 | <widget class="QGroupBox" name="groupBox_2"> | |||
|
145 | <property name="title"> | |||
|
146 | <string>Sections & Symbols</string> | |||
|
147 | </property> | |||
|
148 | <layout class="QFormLayout" name="formLayout_2"> | |||
|
149 | <item row="0" column="0"> | |||
|
150 | <widget class="QLabel" name="label_9"> | |||
|
151 | <property name="text"> | |||
|
152 | <string>Section count:</string> | |||
|
153 | </property> | |||
|
154 | </widget> | |||
|
155 | </item> | |||
|
156 | <item row="1" column="0"> | |||
|
157 | <widget class="QLabel" name="label_10"> | |||
|
158 | <property name="text"> | |||
|
159 | <string>Symbols count:</string> | |||
|
160 | </property> | |||
|
161 | </widget> | |||
|
162 | </item> | |||
|
163 | <item row="0" column="1"> | |||
|
164 | <widget class="QLabel" name="sectionCountLabel"> | |||
|
165 | <property name="text"> | |||
|
166 | <string>none</string> | |||
|
167 | </property> | |||
|
168 | </widget> | |||
|
169 | </item> | |||
|
170 | <item row="1" column="1"> | |||
|
171 | <widget class="QLabel" name="symbolCountLabel"> | |||
|
172 | <property name="text"> | |||
|
173 | <string>none</string> | |||
|
174 | </property> | |||
|
175 | </widget> | |||
|
176 | </item> | |||
|
177 | </layout> | |||
|
178 | </widget> | |||
|
179 | </item> | |||
|
180 | </layout> | |||
|
181 | </widget> | |||
|
182 | <widget class="QWidget" name="symbolsTab"> | |||
|
183 | <attribute name="title"> | |||
|
184 | <string>Symbols</string> | |||
|
185 | </attribute> | |||
|
186 | <layout class="QGridLayout" name="gridLayout_2"> | |||
|
187 | <item row="0" column="1"> | |||
|
188 | <widget class="QLineEdit" name="symbolsFilter"/> | |||
|
189 | </item> | |||
|
190 | <item row="0" column="0"> | |||
|
191 | <widget class="QLabel" name="label_2"> | |||
|
192 | <property name="text"> | |||
|
193 | <string>Filter:</string> | |||
|
194 | </property> | |||
|
195 | </widget> | |||
|
196 | </item> | |||
|
197 | <item row="0" column="2"> | |||
|
198 | <widget class="QCheckBox" name="caseSensitive"> | |||
|
199 | <property name="text"> | |||
|
200 | <string>Case Sensitive</string> | |||
|
201 | </property> | |||
|
202 | </widget> | |||
|
203 | </item> | |||
|
204 | <item row="2" column="0" colspan="3"> | |||
|
205 | <widget class="QTableWidget" name="symbolsList"> | |||
|
206 | <property name="contextMenuPolicy"> | |||
|
207 | <enum>Qt::ActionsContextMenu</enum> | |||
|
208 | </property> | |||
|
209 | <property name="sortingEnabled"> | |||
|
210 | <bool>true</bool> | |||
|
211 | </property> | |||
|
212 | <attribute name="verticalHeaderVisible"> | |||
|
213 | <bool>false</bool> | |||
|
214 | </attribute> | |||
|
215 | <attribute name="verticalHeaderShowSortIndicator" stdset="0"> | |||
|
216 | <bool>false</bool> | |||
|
217 | </attribute> | |||
|
218 | <column> | |||
|
219 | <property name="text"> | |||
|
220 | <string>Index</string> | |||
|
221 | </property> | |||
|
222 | </column> | |||
|
223 | <column> | |||
|
224 | <property name="text"> | |||
|
225 | <string>Value</string> | |||
|
226 | </property> | |||
|
227 | </column> | |||
|
228 | <column> | |||
|
229 | <property name="text"> | |||
|
230 | <string>Size</string> | |||
|
231 | </property> | |||
|
232 | </column> | |||
|
233 | <column> | |||
|
234 | <property name="text"> | |||
|
235 | <string>Type</string> | |||
|
236 | </property> | |||
|
237 | </column> | |||
|
238 | <column> | |||
|
239 | <property name="text"> | |||
|
240 | <string>Link</string> | |||
|
241 | </property> | |||
|
242 | </column> | |||
|
243 | <column> | |||
|
244 | <property name="text"> | |||
|
245 | <string>Section</string> | |||
|
246 | </property> | |||
|
247 | </column> | |||
|
248 | <column> | |||
|
249 | <property name="text"> | |||
|
250 | <string>Name</string> | |||
|
251 | </property> | |||
|
252 | </column> | |||
|
253 | </widget> | |||
|
254 | </item> | |||
|
255 | </layout> | |||
|
256 | </widget> | |||
|
257 | <widget class="QWidget" name="sectionsTab"> | |||
|
258 | <attribute name="title"> | |||
|
259 | <string>Sections</string> | |||
|
260 | </attribute> | |||
|
261 | <layout class="QGridLayout" name="gridLayout_3"> | |||
|
262 | <item row="0" column="0"> | |||
|
263 | <widget class="QSplitter" name="splitter"> | |||
|
264 | <property name="orientation"> | |||
|
265 | <enum>Qt::Horizontal</enum> | |||
|
266 | </property> | |||
|
267 | <widget class="QHexEdit" name="sectionsHexView" native="true"> | |||
|
268 | <property name="minimumSize"> | |||
|
269 | <size> | |||
|
270 | <width>100</width> | |||
|
271 | <height>0</height> | |||
|
272 | </size> | |||
|
273 | </property> | |||
|
274 | </widget> | |||
|
275 | <widget class="QTableWidget" name="sectionsList"> | |||
|
276 | <property name="contextMenuPolicy"> | |||
|
277 | <enum>Qt::ActionsContextMenu</enum> | |||
|
278 | </property> | |||
|
279 | <property name="sortingEnabled"> | |||
|
280 | <bool>true</bool> | |||
|
281 | </property> | |||
|
282 | <attribute name="verticalHeaderVisible"> | |||
|
283 | <bool>false</bool> | |||
|
284 | </attribute> | |||
|
285 | <attribute name="verticalHeaderShowSortIndicator" stdset="0"> | |||
|
286 | <bool>false</bool> | |||
|
287 | </attribute> | |||
|
288 | <column> | |||
|
289 | <property name="text"> | |||
|
290 | <string>Index</string> | |||
|
291 | </property> | |||
|
292 | </column> | |||
|
293 | <column> | |||
|
294 | <property name="text"> | |||
|
295 | <string>Name</string> | |||
|
296 | </property> | |||
|
297 | </column> | |||
|
298 | <column> | |||
|
299 | <property name="text"> | |||
|
300 | <string>Address</string> | |||
|
301 | </property> | |||
|
302 | </column> | |||
|
303 | <column> | |||
|
304 | <property name="text"> | |||
|
305 | <string>Size</string> | |||
|
306 | </property> | |||
|
307 | </column> | |||
|
308 | <column> | |||
|
309 | <property name="text"> | |||
|
310 | <string>File Size</string> | |||
|
311 | </property> | |||
|
312 | </column> | |||
|
313 | <column> | |||
|
314 | <property name="text"> | |||
|
315 | <string>Type</string> | |||
|
316 | </property> | |||
|
317 | </column> | |||
|
318 | </widget> | |||
|
319 | </widget> | |||
|
320 | </item> | |||
|
321 | </layout> | |||
|
322 | </widget> | |||
|
323 | </widget> | |||
|
324 | </item> | |||
|
325 | </layout> | |||
|
326 | </widget> | |||
|
327 | <customwidgets> | |||
|
328 | <customwidget> | |||
|
329 | <class>QHexEdit</class> | |||
|
330 | <extends>QWidget</extends> | |||
|
331 | <header location="global">qhexedit.h</header> | |||
|
332 | <container>1</container> | |||
|
333 | </customwidget> | |||
|
334 | </customwidgets> | |||
|
335 | <resources/> | |||
|
336 | <connections/> | |||
|
337 | </ui> |
@@ -0,0 +1,164 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2013, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@lpp.polytechnique.fr | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | ||||
|
23 | #include "elfinfowdgt.h" | |||
|
24 | ||||
|
25 | elfInfoWdgt::elfInfoWdgt(QWidget *parent) : | |||
|
26 | QWidget(parent) | |||
|
27 | { | |||
|
28 | this->mainLayout = new QVBoxLayout; | |||
|
29 | this->ElfArchitecture= new QLabel; | |||
|
30 | this->ElfType = new QLabel; | |||
|
31 | this->ElfVersion = new QLabel; | |||
|
32 | this->splitter = new QSplitter; | |||
|
33 | this->hexViewer = new QHexEdit; | |||
|
34 | this->elfInfoWdgtLay = new QWidget; | |||
|
35 | this->elfInfoWdgtLayout = new QVBoxLayout; | |||
|
36 | this->segmentsListTableWdgt = new QTableWidget; | |||
|
37 | this->segmentsListTableWdgt->setColumnCount(7); | |||
|
38 | this->segmentsListTableWdgt->setHorizontalHeaderLabels(QStringList()<<"Type"<<"Offset"<<"Vaddr"<<"Paddr"<<"File Size"<<"Mem Size"<<"Flags"); | |||
|
39 | this->sectionsListTableWdgt = new QTableWidget; | |||
|
40 | this->sectionsListTableWdgt->setColumnCount(2); | |||
|
41 | this->sectionsListTableWdgt->setHorizontalHeaderLabels(QStringList()<<"Name"<<"Type"); | |||
|
42 | this->ElfArchitecture->setText(QString("Architecture: ")); | |||
|
43 | this->ElfType->setText(QString("Type: ")); | |||
|
44 | this->ElfVersion->setText(QString("Version: ")); | |||
|
45 | this->elfInfoWdgtLayout->addWidget(this->ElfArchitecture); | |||
|
46 | this->elfInfoWdgtLayout->addWidget(this->ElfType); | |||
|
47 | this->elfInfoWdgtLayout->addWidget(this->ElfVersion); | |||
|
48 | this->elfInfoWdgtLayout->addWidget(this->segmentsListTableWdgt); | |||
|
49 | this->elfInfoWdgtLayout->addWidget(this->sectionsListTableWdgt); | |||
|
50 | this->splitter->addWidget(this->hexViewer); | |||
|
51 | this->splitter->addWidget(this->elfInfoWdgtLay); | |||
|
52 | this->elfInfoWdgtLay->setLayout(this->elfInfoWdgtLayout); | |||
|
53 | this->mainLayout->addWidget(this->splitter); | |||
|
54 | this->setLayout(this->mainLayout); | |||
|
55 | connect(this->segmentsListTableWdgt,SIGNAL(cellActivated(int,int)),this,SLOT(cellActivated(int,int))); | |||
|
56 | connect(this->sectionsListTableWdgt,SIGNAL(cellActivated(int,int)),this,SLOT(cellActivated(int,int))); | |||
|
57 | } | |||
|
58 | ||||
|
59 | ||||
|
60 | void elfInfoWdgt::updateInfo(elfparser *parser) | |||
|
61 | { | |||
|
62 | if(parser!=NULL) | |||
|
63 | { | |||
|
64 | this->ElfArchitecture->setText(QString("Architecture: ")+parser->getArchitecture()); | |||
|
65 | this->ElfType->setText(QString("Type: ")+parser->getType()); | |||
|
66 | this->ElfVersion->setText(QString("Version: 0x")+QString::number(parser->getVersion(),16)); | |||
|
67 | this->updateSectionsTable(parser); | |||
|
68 | this->updateSegmentsTable(parser); | |||
|
69 | } | |||
|
70 | ||||
|
71 | } | |||
|
72 | ||||
|
73 | void elfInfoWdgt::cellActivated(int row, int column) | |||
|
74 | { | |||
|
75 | char* buff=NULL; | |||
|
76 | this->parser->getSectionData(row,&buff); | |||
|
77 | this->hexViewer->setData(QByteArray(buff,this->parser->getSectionDatasz(row))); | |||
|
78 | } | |||
|
79 | ||||
|
80 | ||||
|
81 | void elfInfoWdgt::updateSectionsTable(elfparser* parser) | |||
|
82 | { | |||
|
83 | if(parser!=NULL) | |||
|
84 | { | |||
|
85 | this->parser = parser; | |||
|
86 | QTableWidgetItem *item; | |||
|
87 | for(int i=0 ;i<this->sectionsListTableWdgt->rowCount();i++) | |||
|
88 | { | |||
|
89 | for(int l=0;l<this->sectionsListTableWdgt->columnCount();l++) | |||
|
90 | { | |||
|
91 | item = this->sectionsListTableWdgt->item(i,l); | |||
|
92 | delete item; | |||
|
93 | } | |||
|
94 | } | |||
|
95 | this->sectionsListTableWdgt->setRowCount(parser->getSectioncount()); | |||
|
96 | for(int i=0;i<parser->getSectioncount();i++) | |||
|
97 | { | |||
|
98 | item = new QTableWidgetItem(parser->getSectionName(i)); | |||
|
99 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
100 | this->sectionsListTableWdgt->setItem(i,0,item); | |||
|
101 | item = new QTableWidgetItem(parser->getSectionType(i)); | |||
|
102 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
103 | this->sectionsListTableWdgt->setItem(i,1,item); | |||
|
104 | } | |||
|
105 | this->sectionsListTableWdgt->resizeColumnsToContents(); | |||
|
106 | this->sectionsListTableWdgt->resizeRowsToContents(); | |||
|
107 | } | |||
|
108 | } | |||
|
109 | ||||
|
110 | ||||
|
111 | void elfInfoWdgt::updateSegmentsTable(elfparser* parser) | |||
|
112 | { | |||
|
113 | if(parser!=NULL) | |||
|
114 | { | |||
|
115 | this->parser = parser; | |||
|
116 | QTableWidgetItem *item; | |||
|
117 | for(int i=0 ;i<this->segmentsListTableWdgt->rowCount();i++) | |||
|
118 | { | |||
|
119 | for(int l=0;l<this->segmentsListTableWdgt->columnCount();l++) | |||
|
120 | { | |||
|
121 | item = this->segmentsListTableWdgt->item(i,l); | |||
|
122 | delete item; | |||
|
123 | } | |||
|
124 | } | |||
|
125 | this->segmentsListTableWdgt->setRowCount(parser->getSegmentcount()); | |||
|
126 | for(int i=0;i<parser->getSegmentcount();i++) | |||
|
127 | { | |||
|
128 | item = new QTableWidgetItem(parser->getSegmentType(i)); | |||
|
129 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
130 | this->segmentsListTableWdgt->setItem(i,0,item); | |||
|
131 | item = new QTableWidgetItem("0x"+QString::number(parser->getSegmentOffset(i),16)); | |||
|
132 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
133 | this->segmentsListTableWdgt->setItem(i,1,item); | |||
|
134 | item = new QTableWidgetItem("0x"+QString::number(parser->getSegmentVaddr(i),16)); | |||
|
135 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
136 | this->segmentsListTableWdgt->setItem(i,2,item); | |||
|
137 | item = new QTableWidgetItem("0x"+QString::number(parser->getSegmentPaddr(i),16)); | |||
|
138 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
139 | this->segmentsListTableWdgt->setItem(i,3,item); | |||
|
140 | item = new QTableWidgetItem("0x"+QString::number(parser->getSegmentFilesz(i),16)); | |||
|
141 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
142 | this->segmentsListTableWdgt->setItem(i,4,item); | |||
|
143 | item = new QTableWidgetItem("0x"+QString::number(parser->getSegmentMemsz(i),16)); | |||
|
144 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
145 | this->segmentsListTableWdgt->setItem(i,5,item); | |||
|
146 | item = new QTableWidgetItem(parser->getSegmentFlags(i)); | |||
|
147 | item->setFlags(item->flags() &~ Qt::ItemIsEditable); | |||
|
148 | this->segmentsListTableWdgt->setItem(i,6,item); | |||
|
149 | } | |||
|
150 | this->segmentsListTableWdgt->resizeColumnsToContents(); | |||
|
151 | this->segmentsListTableWdgt->resizeRowsToContents(); | |||
|
152 | } | |||
|
153 | } | |||
|
154 | ||||
|
155 | ||||
|
156 | ||||
|
157 | ||||
|
158 | ||||
|
159 | ||||
|
160 | ||||
|
161 | ||||
|
162 | ||||
|
163 | ||||
|
164 |
@@ -0,0 +1,64 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2013, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@lpp.polytechnique.fr | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #ifndef ELFINFOWDGT_H | |||
|
23 | #define ELFINFOWDGT_H | |||
|
24 | ||||
|
25 | #include <QtWidgets/QWidget> | |||
|
26 | #include "elfparser.h" | |||
|
27 | #include <QtWidgets/QVBoxLayout> | |||
|
28 | #include <QtWidgets/QHBoxLayout> | |||
|
29 | #include <QtWidgets/QLabel> | |||
|
30 | #include <QtWidgets/QTextEdit> | |||
|
31 | #include <QtWidgets/QTableWidget> | |||
|
32 | #include <qhexedit.h> | |||
|
33 | #include <QtWidgets/QSplitter> | |||
|
34 | ||||
|
35 | class elfInfoWdgt : public QWidget | |||
|
36 | { | |||
|
37 | Q_OBJECT | |||
|
38 | public: | |||
|
39 | explicit elfInfoWdgt(QWidget *parent = 0); | |||
|
40 | ||||
|
41 | signals: | |||
|
42 | ||||
|
43 | ||||
|
44 | public slots: | |||
|
45 | void updateInfo(elfparser* parser); | |||
|
46 | void cellActivated ( int row, int column ); | |||
|
47 | ||||
|
48 | private: | |||
|
49 | void updateSectionsTable(elfparser* parser); | |||
|
50 | void updateSegmentsTable(elfparser* parser); | |||
|
51 | QVBoxLayout* mainLayout; | |||
|
52 | QLabel* ElfArchitecture; | |||
|
53 | QLabel* ElfType; | |||
|
54 | QLabel* ElfVersion; | |||
|
55 | QTableWidget* segmentsListTableWdgt,*sectionsListTableWdgt; | |||
|
56 | QHexEdit* hexViewer; | |||
|
57 | QSplitter* splitter; | |||
|
58 | QWidget* elfInfoWdgtLay; | |||
|
59 | QVBoxLayout* elfInfoWdgtLayout; | |||
|
60 | elfparser* parser; | |||
|
61 | ||||
|
62 | }; | |||
|
63 | ||||
|
64 | #endif // ELFINFOWDGT_H |
This diff has been collapsed as it changes many lines, (522 lines changed) Show them Hide them | |||||
@@ -0,0 +1,522 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2013, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@lpp.polytechnique.fr | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #include "elfparser.h" | |||
|
23 | #include <sys/types.h> | |||
|
24 | #include <sys/stat.h> | |||
|
25 | #include <fcntl.h> | |||
|
26 | #include <unistd.h> | |||
|
27 | ||||
|
28 | extern QString elfresolveMachine(Elf64_Half e_machine); | |||
|
29 | ||||
|
30 | ||||
|
31 | elfparser::elfparser() | |||
|
32 | { | |||
|
33 | this->opened = false; | |||
|
34 | this->type_elf = false; | |||
|
35 | this->elfFile = (int)NULL; | |||
|
36 | this->e = NULL; | |||
|
37 | } | |||
|
38 | ||||
|
39 | ||||
|
40 | int elfparser::setFilename(const QString &name) | |||
|
41 | { | |||
|
42 | this->closeFile(); | |||
|
43 | if(elf_version(EV_CURRENT)==EV_NONE)return 0; | |||
|
44 | #ifdef _ELF_WINDOWS_ | |||
|
45 | this->elfFile = open(name.toStdString().c_str(),O_RDONLY|O_BINARY ,0); | |||
|
46 | #else | |||
|
47 | this->elfFile = open(name.toStdString().c_str(),O_RDONLY ,0); | |||
|
48 | #endif | |||
|
49 | if(this->elfFile==(int)NULL)return 0; | |||
|
50 | this->e = elf_begin(this->elfFile,ELF_C_READ,NULL); | |||
|
51 | if(this->e==NULL)return 0; | |||
|
52 | this->ek = elf_kind(this->e); | |||
|
53 | gelf_getehdr (this->e, &this->ehdr ); | |||
|
54 | elf_getshdrstrndx (this->e, &this->shstrndx); | |||
|
55 | this->updateSegments(); | |||
|
56 | this->updateSections(); | |||
|
57 | return 1; | |||
|
58 | } | |||
|
59 | ||||
|
60 | ||||
|
61 | int elfparser::closeFile() | |||
|
62 | { | |||
|
63 | if(this->elfFile!=(int)NULL) | |||
|
64 | { | |||
|
65 | if(this->e!=NULL) | |||
|
66 | { | |||
|
67 | elf_end(this->e); | |||
|
68 | this->e = NULL; | |||
|
69 | } | |||
|
70 | close(this->elfFile); | |||
|
71 | this->elfFile = (int)NULL; | |||
|
72 | } | |||
|
73 | return 0; | |||
|
74 | } | |||
|
75 | ||||
|
76 | QString elfparser::getClass() | |||
|
77 | { | |||
|
78 | if(this->e!=NULL) | |||
|
79 | { | |||
|
80 | int eclass = gelf_getclass(this->e); | |||
|
81 | if(eclass==ELFCLASS32)return "ELF32"; | |||
|
82 | if(eclass==ELFCLASS64)return "ELF64"; | |||
|
83 | } | |||
|
84 | return "none"; | |||
|
85 | } | |||
|
86 | ||||
|
87 | ||||
|
88 | bool elfparser::isopened() | |||
|
89 | { | |||
|
90 | return this->opened; | |||
|
91 | } | |||
|
92 | ||||
|
93 | ||||
|
94 | bool elfparser::iself() | |||
|
95 | { | |||
|
96 | return this->type_elf; | |||
|
97 | } | |||
|
98 | ||||
|
99 | ||||
|
100 | QString elfparser::getArchitecture() | |||
|
101 | { | |||
|
102 | if(this->e!=NULL) | |||
|
103 | { | |||
|
104 | return elfresolveMachine(this->ehdr.e_machine); | |||
|
105 | } | |||
|
106 | return ""; | |||
|
107 | } | |||
|
108 | ||||
|
109 | ||||
|
110 | QString elfparser::getType() | |||
|
111 | { | |||
|
112 | QString kind(""); | |||
|
113 | if(this->e!=NULL) | |||
|
114 | { | |||
|
115 | switch(this->ek) | |||
|
116 | { | |||
|
117 | case ELF_K_AR: | |||
|
118 | kind = "Archive"; | |||
|
119 | break; | |||
|
120 | case ELF_K_ELF: | |||
|
121 | kind = "Elf"; | |||
|
122 | break; | |||
|
123 | case ELF_K_COFF: | |||
|
124 | kind = "COFF"; | |||
|
125 | break; | |||
|
126 | case ELF_K_NUM: | |||
|
127 | kind = "NUM"; | |||
|
128 | break; | |||
|
129 | case ELF_K_NONE: | |||
|
130 | kind = "Data"; | |||
|
131 | break; | |||
|
132 | default: | |||
|
133 | kind = "Unknow"; | |||
|
134 | break; | |||
|
135 | } | |||
|
136 | } | |||
|
137 | return kind; | |||
|
138 | } | |||
|
139 | ||||
|
140 | QString elfparser::getEndianness() | |||
|
141 | { | |||
|
142 | if(this->e!=NULL) | |||
|
143 | { | |||
|
144 | if(this->ehdr.e_ident[EI_DATA]==ELFDATA2LSB)return "2's complement, little endian"; | |||
|
145 | if(this->ehdr.e_ident[EI_DATA]==ELFDATA2MSB)return "2's complement, big endian"; | |||
|
146 | } | |||
|
147 | return "none"; | |||
|
148 | } | |||
|
149 | ||||
|
150 | QString elfparser::getABI() | |||
|
151 | { | |||
|
152 | if(this->e!=NULL) | |||
|
153 | { | |||
|
154 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_NONE)return "UNIX System V ABI"; | |||
|
155 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_SYSV)return "Alias"; | |||
|
156 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_HPUX)return "HP-UX"; | |||
|
157 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_NETBSD)return "NetBSD"; | |||
|
158 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_LINUX)return "Object uses GNU ELF extensions"; | |||
|
159 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_SOLARIS)return "Sun Solaris"; | |||
|
160 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_AIX)return "IBM AIX"; | |||
|
161 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_IRIX)return "SGI Irix"; | |||
|
162 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_FREEBSD)return "FreeBSD"; | |||
|
163 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_TRU64)return "Compaq TRU64 UNIX"; | |||
|
164 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_MODESTO)return " Novell Modesto"; | |||
|
165 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_OPENBSD)return "OpenBSD"; | |||
|
166 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_ARM_AEABI)return "ARM EABI"; | |||
|
167 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_ARM)return "ARM"; | |||
|
168 | if(this->ehdr.e_ident[EI_OSABI]==ELFOSABI_STANDALONE)return "Standalone (embedded) application"; | |||
|
169 | } | |||
|
170 | return "none"; | |||
|
171 | } | |||
|
172 | ||||
|
173 | ||||
|
174 | qint64 elfparser::getVersion() | |||
|
175 | { | |||
|
176 | if(this->e!=NULL) | |||
|
177 | { | |||
|
178 | return this->ehdr.e_version; | |||
|
179 | } | |||
|
180 | return -1; | |||
|
181 | } | |||
|
182 | ||||
|
183 | qint64 elfparser::getEntryPointAddress() | |||
|
184 | { | |||
|
185 | if(this->e!=NULL) | |||
|
186 | { | |||
|
187 | return this->ehdr.e_entry; | |||
|
188 | } | |||
|
189 | return -1; | |||
|
190 | } | |||
|
191 | ||||
|
192 | ||||
|
193 | int elfparser::getSectioncount() | |||
|
194 | { | |||
|
195 | return (int)this->SectionCount; | |||
|
196 | } | |||
|
197 | ||||
|
198 | ||||
|
199 | int elfparser::getSegmentcount() | |||
|
200 | { | |||
|
201 | return (int)this->SegmentCount; | |||
|
202 | } | |||
|
203 | ||||
|
204 | ||||
|
205 | QString elfparser::getSegmentType(int index) | |||
|
206 | { | |||
|
207 | QString type(""); | |||
|
208 | if(this->e!=NULL) | |||
|
209 | { | |||
|
210 | if(index < this->Segments.count()) | |||
|
211 | { | |||
|
212 | switch(this->Segments.at(index)->p_type) | |||
|
213 | { | |||
|
214 | case PT_NULL: | |||
|
215 | type = "Program header table entry unused"; | |||
|
216 | break; | |||
|
217 | case PT_LOAD: | |||
|
218 | type = "Loadable program segment"; | |||
|
219 | break; | |||
|
220 | case PT_DYNAMIC : | |||
|
221 | type = "Dynamic linking information"; | |||
|
222 | break; | |||
|
223 | case PT_INTERP: | |||
|
224 | type ="Program interpreter"; | |||
|
225 | break; | |||
|
226 | case PT_NOTE: | |||
|
227 | type = "Auxiliary information"; | |||
|
228 | break; | |||
|
229 | case PT_SHLIB: | |||
|
230 | type = "Reserved"; | |||
|
231 | break; | |||
|
232 | case PT_PHDR: | |||
|
233 | type = "Entry for header table itself"; | |||
|
234 | break; | |||
|
235 | case PT_TLS: | |||
|
236 | type = "Thread-local storage segment"; | |||
|
237 | break; | |||
|
238 | case PT_NUM: | |||
|
239 | type = "Number of defined types"; | |||
|
240 | break; | |||
|
241 | case PT_LOOS: | |||
|
242 | type = "Start of OS-specific"; | |||
|
243 | break; | |||
|
244 | case PT_SUNWSTACK: | |||
|
245 | type = "Stack segment"; | |||
|
246 | break; | |||
|
247 | case PT_LOPROC: | |||
|
248 | type = "Start of processor-specific"; | |||
|
249 | break; | |||
|
250 | case PT_HIPROC: | |||
|
251 | type = "End of processor-specific"; | |||
|
252 | break; | |||
|
253 | default: | |||
|
254 | type = "Unknow Section Type"; | |||
|
255 | break; | |||
|
256 | } | |||
|
257 | } | |||
|
258 | } | |||
|
259 | ||||
|
260 | return type; | |||
|
261 | } | |||
|
262 | ||||
|
263 | ||||
|
264 | qint64 elfparser::getSegmentOffset(int index) | |||
|
265 | { | |||
|
266 | qint64 Offset=-1; | |||
|
267 | if(this->e!=NULL) | |||
|
268 | { | |||
|
269 | if(index < this->Segments.count()) | |||
|
270 | { | |||
|
271 | Offset = (qint64)this->Segments.at(index)->p_offset; | |||
|
272 | } | |||
|
273 | } | |||
|
274 | return Offset; | |||
|
275 | } | |||
|
276 | ||||
|
277 | ||||
|
278 | qint64 elfparser::getSegmentVaddr(int index) | |||
|
279 | { | |||
|
280 | int64_t Vaddr = 0; | |||
|
281 | if(this->e!=NULL) | |||
|
282 | { | |||
|
283 | if(index < this->Segments.count()) | |||
|
284 | { | |||
|
285 | Vaddr = (int64_t)this->Segments.at(index)->p_vaddr; | |||
|
286 | } | |||
|
287 | } | |||
|
288 | return Vaddr; | |||
|
289 | } | |||
|
290 | ||||
|
291 | ||||
|
292 | qint64 elfparser::getSegmentPaddr(int index) | |||
|
293 | { | |||
|
294 | int64_t Paddr=0; | |||
|
295 | if(this->e!=NULL) | |||
|
296 | { | |||
|
297 | if(index < this->Segments.count()) | |||
|
298 | { | |||
|
299 | Paddr = (int64_t)this->Segments.at(index)->p_paddr; | |||
|
300 | } | |||
|
301 | } | |||
|
302 | return Paddr; | |||
|
303 | } | |||
|
304 | ||||
|
305 | qint64 elfparser::getSectionPaddr(int index) | |||
|
306 | { | |||
|
307 | int64_t Paddr=0; | |||
|
308 | if(this->e!=NULL) | |||
|
309 | { | |||
|
310 | if(index < this->sections.count()) | |||
|
311 | { | |||
|
312 | Paddr = (int64_t)this->sections.at(index)->section_header->sh_addr; | |||
|
313 | } | |||
|
314 | } | |||
|
315 | return Paddr; | |||
|
316 | } | |||
|
317 | ||||
|
318 | ||||
|
319 | qint64 elfparser::getSegmentFilesz(int index) | |||
|
320 | { | |||
|
321 | int64_t FileSz=0; | |||
|
322 | if(this->e!=NULL) | |||
|
323 | { | |||
|
324 | if(index < this->Segments.count()) | |||
|
325 | { | |||
|
326 | FileSz = (int64_t)this->Segments.at(index)->p_filesz; | |||
|
327 | } | |||
|
328 | } | |||
|
329 | return FileSz; | |||
|
330 | } | |||
|
331 | ||||
|
332 | qint64 elfparser::getSectionDatasz(int index) | |||
|
333 | { | |||
|
334 | int64_t DataSz=0; | |||
|
335 | if(this->e!=NULL) | |||
|
336 | { | |||
|
337 | if(index < this->sections.count()) | |||
|
338 | { | |||
|
339 | DataSz = (int64_t)this->sections.at(index)->data->d_size; | |||
|
340 | } | |||
|
341 | } | |||
|
342 | return DataSz; | |||
|
343 | } | |||
|
344 | ||||
|
345 | bool elfparser::getSectionData(int index, char **buffer) | |||
|
346 | { | |||
|
347 | if(this->e!=NULL) | |||
|
348 | { | |||
|
349 | if(index < this->sections.count()) | |||
|
350 | { | |||
|
351 | *buffer = (char *)this->sections.at(index)->data->d_buf; | |||
|
352 | return true; | |||
|
353 | } | |||
|
354 | } | |||
|
355 | return false; | |||
|
356 | } | |||
|
357 | ||||
|
358 | ||||
|
359 | qint64 elfparser::getSegmentMemsz(int index) | |||
|
360 | { | |||
|
361 | int64_t MemSz=0; | |||
|
362 | if(this->e!=NULL) | |||
|
363 | { | |||
|
364 | if(index < this->Segments.count()) | |||
|
365 | { | |||
|
366 | MemSz = (int64_t)this->Segments.at(index)->p_memsz; | |||
|
367 | } | |||
|
368 | } | |||
|
369 | return MemSz; | |||
|
370 | } | |||
|
371 | ||||
|
372 | qint64 elfparser::getSectionMemsz(int index) | |||
|
373 | { | |||
|
374 | int64_t MemSz=0; | |||
|
375 | if(this->e!=NULL) | |||
|
376 | { | |||
|
377 | if(index < this->sections.count()) | |||
|
378 | { | |||
|
379 | MemSz = (int64_t)this->sections.at(index)->section_header->sh_size; | |||
|
380 | } | |||
|
381 | } | |||
|
382 | return MemSz; | |||
|
383 | } | |||
|
384 | ||||
|
385 | ||||
|
386 | QString elfparser::getSegmentFlags(int index) | |||
|
387 | { | |||
|
388 | QString flags(""); | |||
|
389 | if(this->e!=NULL) | |||
|
390 | { | |||
|
391 | if(index < this->Segments.count()) | |||
|
392 | { | |||
|
393 | if((this->Segments.at(index)->p_flags&PF_X) == PF_X)flags+="x"; | |||
|
394 | if((this->Segments.at(index)->p_flags&PF_W) == PF_W)flags+="w"; | |||
|
395 | if((this->Segments.at(index)->p_flags&PF_R) == PF_R)flags+="r"; | |||
|
396 | if((this->Segments.at(index)->p_flags&PF_MASKOS) == PF_MASKOS)flags+=" OS-specific"; | |||
|
397 | if((this->Segments.at(index)->p_flags&PF_MASKPROC) == PF_MASKPROC)flags+=" Processor-specific"; | |||
|
398 | } | |||
|
399 | } | |||
|
400 | return flags; | |||
|
401 | } | |||
|
402 | ||||
|
403 | ||||
|
404 | QString elfparser::getSectionName(int index) | |||
|
405 | { | |||
|
406 | char* nameChr = elf_strptr(this->e , this->shstrndx , this->sections.at(index)->section_header->sh_name); | |||
|
407 | return QString(nameChr); | |||
|
408 | } | |||
|
409 | ||||
|
410 | ||||
|
411 | void elfparser::updateSections() | |||
|
412 | { | |||
|
413 | for(int i=0;i<this->sections.count();i++) | |||
|
414 | { | |||
|
415 | delete this->sections.at(i); | |||
|
416 | } | |||
|
417 | this->sections.clear(); | |||
|
418 | this->scn = elf_nextscn (this->e , NULL ); | |||
|
419 | this->SectionCount = 0; | |||
|
420 | while( this->scn != NULL ) | |||
|
421 | { | |||
|
422 | GElf_Shdr* shdr = (GElf_Shdr*)malloc(sizeof(GElf_Shdr)); | |||
|
423 | gelf_getshdr ( this->scn , shdr ); | |||
|
424 | Elf_Data* data = elf_getdata(this->scn, NULL); | |||
|
425 | this->sections.append(new Elf_Section(data,shdr)); | |||
|
426 | this->SectionCount+=1; | |||
|
427 | this->scn = elf_nextscn(e , scn); | |||
|
428 | } | |||
|
429 | } | |||
|
430 | ||||
|
431 | ||||
|
432 | void elfparser::updateSegments() | |||
|
433 | { | |||
|
434 | elf_getphdrnum (this->e , &this->SegmentCount); | |||
|
435 | for(int i=0;i<this->Segments.count();i++) | |||
|
436 | { | |||
|
437 | free(this->Segments.at(i)); | |||
|
438 | } | |||
|
439 | this->Segments.clear(); | |||
|
440 | for(int i=0;i<(int)this->SegmentCount;i++) | |||
|
441 | { | |||
|
442 | GElf_Phdr* header=(GElf_Phdr*)malloc(sizeof(GElf_Phdr)); | |||
|
443 | gelf_getphdr (this->e , i , header ); | |||
|
444 | this->Segments.append(header); | |||
|
445 | } | |||
|
446 | } | |||
|
447 | ||||
|
448 | ||||
|
449 | ||||
|
450 | ||||
|
451 | ||||
|
452 | QString elfparser::getSectionType(int index) | |||
|
453 | { | |||
|
454 | QString type(""); | |||
|
455 | if(this->e!=NULL) | |||
|
456 | { | |||
|
457 | if(index < this->Segments.count()) | |||
|
458 | { | |||
|
459 | switch(this->Segments.at(index)->p_type) | |||
|
460 | { | |||
|
461 | case SHT_NULL : type = "Section header table entry unused"; break; | |||
|
462 | case SHT_PROGBITS : type = "Program data"; break; | |||
|
463 | case SHT_SYMTAB : type = "Symbol table"; break; | |||
|
464 | case SHT_STRTAB : type = "String table"; break; | |||
|
465 | case SHT_RELA : type = "Relocation entries with addends"; break; | |||
|
466 | case SHT_HASH : type = "Symbol hash table"; break; | |||
|
467 | case SHT_DYNAMIC : type = "Dynamic linking information"; break; | |||
|
468 | case SHT_NOTE : type = "Notes"; break; | |||
|
469 | case SHT_NOBITS :type = "Program space with no data (bss)"; break; | |||
|
470 | case SHT_REL :type = "Relocation entries, no addends"; break; | |||
|
471 | case SHT_SHLIB : type = "Reserved"; break; | |||
|
472 | case SHT_DYNSYM : type = "Dynamic linker symbol table"; break; | |||
|
473 | case SHT_INIT_ARRAY : type = "Array of constructors"; break; | |||
|
474 | case SHT_FINI_ARRAY : type = "Array of destructors"; break; | |||
|
475 | case SHT_PREINIT_ARRAY : type = "Array of pre-constructors"; break; | |||
|
476 | case SHT_GROUP : type = "Section group"; break; | |||
|
477 | case SHT_SYMTAB_SHNDX : type = "Extended section indeces"; break; | |||
|
478 | case SHT_NUM : type = "Number of defined types. "; break; | |||
|
479 | case SHT_LOOS : type = "Start OS-specific. "; break; | |||
|
480 | case SHT_LOSUNW : type = "Sun-specific low bound. "; break; | |||
|
481 | case SHT_SUNW_COMDAT : type = " "; break; | |||
|
482 | case SHT_SUNW_syminfo : type = " "; break; | |||
|
483 | case SHT_GNU_verdef : type = "Version definition section. "; break; | |||
|
484 | case SHT_GNU_verneed : type = "Version needs section. "; break; | |||
|
485 | case SHT_GNU_versym : type = "Version symbol table. "; break; | |||
|
486 | case SHT_LOPROC : type = "Start of processor-specific"; break; | |||
|
487 | case SHT_HIPROC : type = "End of processor-specific"; break; | |||
|
488 | case SHT_HIUSER : type = "End of application-specific"; break; | |||
|
489 | } | |||
|
490 | } | |||
|
491 | } | |||
|
492 | return type; | |||
|
493 | } | |||
|
494 | ||||
|
495 | bool elfparser::isElf(const QString &File) | |||
|
496 | { | |||
|
497 | int file =0; | |||
|
498 | #ifdef _ELF_WINDOWS_ | |||
|
499 | file = open(File.toStdString().c_str(),O_RDONLY|O_BINARY ,0); | |||
|
500 | #else | |||
|
501 | file = open(File.toStdString().c_str(),O_RDONLY ,0); | |||
|
502 | #endif | |||
|
503 | char Magic[4]; | |||
|
504 | if(file!=-1) | |||
|
505 | { | |||
|
506 | size_t res = read(file,Magic,4); | |||
|
507 | close(file); | |||
|
508 | if((res == 4) && (Magic[0]==0x7f) && (Magic[1]==0x45) && (Magic[2]==0x4c) && (Magic[3]==0x46)) | |||
|
509 | { | |||
|
510 | return true; | |||
|
511 | } | |||
|
512 | } | |||
|
513 | return false; | |||
|
514 | } | |||
|
515 | ||||
|
516 | ||||
|
517 | ||||
|
518 | ||||
|
519 | ||||
|
520 | ||||
|
521 | ||||
|
522 |
@@ -0,0 +1,89 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2013, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 3 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@lpp.polytechnique.fr | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #ifndef ELFPARSER_H | |||
|
23 | #define ELFPARSER_H | |||
|
24 | #include <libelf.h> | |||
|
25 | #include <gelf.h> | |||
|
26 | #include <QString> | |||
|
27 | #include <stdio.h> | |||
|
28 | #include <QList> | |||
|
29 | #include <stdint.h> | |||
|
30 | #include "elffile.h" | |||
|
31 | ||||
|
32 | class elfparser | |||
|
33 | { | |||
|
34 | public: | |||
|
35 | elfparser(); | |||
|
36 | bool iself(); | |||
|
37 | bool isopened(); | |||
|
38 | int setFilename(const QString& name); | |||
|
39 | int closeFile(); | |||
|
40 | QString getClass(); | |||
|
41 | QString getArchitecture(); | |||
|
42 | QString getType(); | |||
|
43 | QString getEndianness(); | |||
|
44 | QString getABI(); | |||
|
45 | qint64 getVersion(); | |||
|
46 | qint64 getEntryPointAddress(); | |||
|
47 | int getSectioncount(); | |||
|
48 | int getSegmentcount(); | |||
|
49 | QString getSegmentType(int index); | |||
|
50 | qint64 getSegmentOffset(int index); | |||
|
51 | qint64 getSegmentVaddr(int index); | |||
|
52 | qint64 getSegmentPaddr(int index); | |||
|
53 | qint64 getSectionPaddr(int index); | |||
|
54 | qint64 getSegmentFilesz(int index); | |||
|
55 | qint64 getSectionDatasz(int index); | |||
|
56 | bool getSectionData(int index, char **buffer); | |||
|
57 | qint64 getSegmentMemsz(int index); | |||
|
58 | qint64 getSectionMemsz(int index); | |||
|
59 | QString getSegmentFlags(int index); | |||
|
60 | QString getSectionName(int index); | |||
|
61 | QString getSectionType(int index); | |||
|
62 | static bool isElf(const QString& File); | |||
|
63 | ||||
|
64 | private: | |||
|
65 | void updateSections(); | |||
|
66 | void updateSegments(); | |||
|
67 | int elfFile; | |||
|
68 | bool opened; | |||
|
69 | bool type_elf; | |||
|
70 | Elf* e; | |||
|
71 | Elf_Kind ek; | |||
|
72 | GElf_Ehdr ehdr; | |||
|
73 | Elf_Scn * scn; | |||
|
74 | Elf_Data * data; | |||
|
75 | size_t SectionCount,SegmentCount, shstrndx; | |||
|
76 | QList<GElf_Phdr*> Segments; | |||
|
77 | QList<Elf_Section*> sections; | |||
|
78 | ||||
|
79 | }; | |||
|
80 | ||||
|
81 | #endif // ELFPARSER_H | |||
|
82 | ||||
|
83 | ||||
|
84 | ||||
|
85 | ||||
|
86 | ||||
|
87 | ||||
|
88 | ||||
|
89 |
@@ -0,0 +1,481 | |||||
|
1 | GNU LIBRARY GENERAL PUBLIC LICENSE | |||
|
2 | Version 2, June 1991 | |||
|
3 | ||||
|
4 | Copyright (C) 1991 Free Software Foundation, Inc. | |||
|
5 | 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
6 | Everyone is permitted to copy and distribute verbatim copies | |||
|
7 | of this license document, but changing it is not allowed. | |||
|
8 | ||||
|
9 | [This is the first released version of the library GPL. It is | |||
|
10 | numbered 2 because it goes with version 2 of the ordinary GPL.] | |||
|
11 | ||||
|
12 | Preamble | |||
|
13 | ||||
|
14 | The licenses for most software are designed to take away your | |||
|
15 | freedom to share and change it. By contrast, the GNU General Public | |||
|
16 | Licenses are intended to guarantee your freedom to share and change | |||
|
17 | free software--to make sure the software is free for all its users. | |||
|
18 | ||||
|
19 | This license, the Library General Public License, applies to some | |||
|
20 | specially designated Free Software Foundation software, and to any | |||
|
21 | other libraries whose authors decide to use it. You can use it for | |||
|
22 | your libraries, too. | |||
|
23 | ||||
|
24 | When we speak of free software, we are referring to freedom, not | |||
|
25 | price. Our General Public Licenses are designed to make sure that you | |||
|
26 | have the freedom to distribute copies of free software (and charge for | |||
|
27 | this service if you wish), that you receive source code or can get it | |||
|
28 | if you want it, that you can change the software or use pieces of it | |||
|
29 | in new free programs; and that you know you can do these things. | |||
|
30 | ||||
|
31 | To protect your rights, we need to make restrictions that forbid | |||
|
32 | anyone to deny you these rights or to ask you to surrender the rights. | |||
|
33 | These restrictions translate to certain responsibilities for you if | |||
|
34 | you distribute copies of the library, or if you modify it. | |||
|
35 | ||||
|
36 | For example, if you distribute copies of the library, whether gratis | |||
|
37 | or for a fee, you must give the recipients all the rights that we gave | |||
|
38 | you. You must make sure that they, too, receive or can get the source | |||
|
39 | code. If you link a program with the library, you must provide | |||
|
40 | complete object files to the recipients so that they can relink them | |||
|
41 | with the library, after making changes to the library and recompiling | |||
|
42 | it. And you must show them these terms so they know their rights. | |||
|
43 | ||||
|
44 | Our method of protecting your rights has two steps: (1) copyright | |||
|
45 | the library, and (2) offer you this license which gives you legal | |||
|
46 | permission to copy, distribute and/or modify the library. | |||
|
47 | ||||
|
48 | Also, for each distributor's protection, we want to make certain | |||
|
49 | that everyone understands that there is no warranty for this free | |||
|
50 | library. If the library is modified by someone else and passed on, we | |||
|
51 | want its recipients to know that what they have is not the original | |||
|
52 | version, so that any problems introduced by others will not reflect on | |||
|
53 | the original authors' reputations. | |||
|
54 | ||||
|
55 | Finally, any free program is threatened constantly by software | |||
|
56 | patents. We wish to avoid the danger that companies distributing free | |||
|
57 | software will individually obtain patent licenses, thus in effect | |||
|
58 | transforming the program into proprietary software. To prevent this, | |||
|
59 | we have made it clear that any patent must be licensed for everyone's | |||
|
60 | free use or not licensed at all. | |||
|
61 | ||||
|
62 | Most GNU software, including some libraries, is covered by the ordinary | |||
|
63 | GNU General Public License, which was designed for utility programs. This | |||
|
64 | license, the GNU Library General Public License, applies to certain | |||
|
65 | designated libraries. This license is quite different from the ordinary | |||
|
66 | one; be sure to read it in full, and don't assume that anything in it is | |||
|
67 | the same as in the ordinary license. | |||
|
68 | ||||
|
69 | The reason we have a separate public license for some libraries is that | |||
|
70 | they blur the distinction we usually make between modifying or adding to a | |||
|
71 | program and simply using it. Linking a program with a library, without | |||
|
72 | changing the library, is in some sense simply using the library, and is | |||
|
73 | analogous to running a utility program or application program. However, in | |||
|
74 | a textual and legal sense, the linked executable is a combined work, a | |||
|
75 | derivative of the original library, and the ordinary General Public License | |||
|
76 | treats it as such. | |||
|
77 | ||||
|
78 | Because of this blurred distinction, using the ordinary General | |||
|
79 | Public License for libraries did not effectively promote software | |||
|
80 | sharing, because most developers did not use the libraries. We | |||
|
81 | concluded that weaker conditions might promote sharing better. | |||
|
82 | ||||
|
83 | However, unrestricted linking of non-free programs would deprive the | |||
|
84 | users of those programs of all benefit from the free status of the | |||
|
85 | libraries themselves. This Library General Public License is intended to | |||
|
86 | permit developers of non-free programs to use free libraries, while | |||
|
87 | preserving your freedom as a user of such programs to change the free | |||
|
88 | libraries that are incorporated in them. (We have not seen how to achieve | |||
|
89 | this as regards changes in header files, but we have achieved it as regards | |||
|
90 | changes in the actual functions of the Library.) The hope is that this | |||
|
91 | will lead to faster development of free libraries. | |||
|
92 | ||||
|
93 | The precise terms and conditions for copying, distribution and | |||
|
94 | modification follow. Pay close attention to the difference between a | |||
|
95 | "work based on the library" and a "work that uses the library". The | |||
|
96 | former contains code derived from the library, while the latter only | |||
|
97 | works together with the library. | |||
|
98 | ||||
|
99 | Note that it is possible for a library to be covered by the ordinary | |||
|
100 | General Public License rather than by this special one. | |||
|
101 | ||||
|
102 | GNU LIBRARY GENERAL PUBLIC LICENSE | |||
|
103 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |||
|
104 | ||||
|
105 | 0. This License Agreement applies to any software library which | |||
|
106 | contains a notice placed by the copyright holder or other authorized | |||
|
107 | party saying it may be distributed under the terms of this Library | |||
|
108 | General Public License (also called "this License"). Each licensee is | |||
|
109 | addressed as "you". | |||
|
110 | ||||
|
111 | A "library" means a collection of software functions and/or data | |||
|
112 | prepared so as to be conveniently linked with application programs | |||
|
113 | (which use some of those functions and data) to form executables. | |||
|
114 | ||||
|
115 | The "Library", below, refers to any such software library or work | |||
|
116 | which has been distributed under these terms. A "work based on the | |||
|
117 | Library" means either the Library or any derivative work under | |||
|
118 | copyright law: that is to say, a work containing the Library or a | |||
|
119 | portion of it, either verbatim or with modifications and/or translated | |||
|
120 | straightforwardly into another language. (Hereinafter, translation is | |||
|
121 | included without limitation in the term "modification".) | |||
|
122 | ||||
|
123 | "Source code" for a work means the preferred form of the work for | |||
|
124 | making modifications to it. For a library, complete source code means | |||
|
125 | all the source code for all modules it contains, plus any associated | |||
|
126 | interface definition files, plus the scripts used to control compilation | |||
|
127 | and installation of the library. | |||
|
128 | ||||
|
129 | Activities other than copying, distribution and modification are not | |||
|
130 | covered by this License; they are outside its scope. The act of | |||
|
131 | running a program using the Library is not restricted, and output from | |||
|
132 | such a program is covered only if its contents constitute a work based | |||
|
133 | on the Library (independent of the use of the Library in a tool for | |||
|
134 | writing it). Whether that is true depends on what the Library does | |||
|
135 | and what the program that uses the Library does. | |||
|
136 | ||||
|
137 | 1. You may copy and distribute verbatim copies of the Library's | |||
|
138 | complete source code as you receive it, in any medium, provided that | |||
|
139 | you conspicuously and appropriately publish on each copy an | |||
|
140 | appropriate copyright notice and disclaimer of warranty; keep intact | |||
|
141 | all the notices that refer to this License and to the absence of any | |||
|
142 | warranty; and distribute a copy of this License along with the | |||
|
143 | Library. | |||
|
144 | ||||
|
145 | You may charge a fee for the physical act of transferring a copy, | |||
|
146 | and you may at your option offer warranty protection in exchange for a | |||
|
147 | fee. | |||
|
148 | ||||
|
149 | 2. You may modify your copy or copies of the Library or any portion | |||
|
150 | of it, thus forming a work based on the Library, and copy and | |||
|
151 | distribute such modifications or work under the terms of Section 1 | |||
|
152 | above, provided that you also meet all of these conditions: | |||
|
153 | ||||
|
154 | a) The modified work must itself be a software library. | |||
|
155 | ||||
|
156 | b) You must cause the files modified to carry prominent notices | |||
|
157 | stating that you changed the files and the date of any change. | |||
|
158 | ||||
|
159 | c) You must cause the whole of the work to be licensed at no | |||
|
160 | charge to all third parties under the terms of this License. | |||
|
161 | ||||
|
162 | d) If a facility in the modified Library refers to a function or a | |||
|
163 | table of data to be supplied by an application program that uses | |||
|
164 | the facility, other than as an argument passed when the facility | |||
|
165 | is invoked, then you must make a good faith effort to ensure that, | |||
|
166 | in the event an application does not supply such function or | |||
|
167 | table, the facility still operates, and performs whatever part of | |||
|
168 | its purpose remains meaningful. | |||
|
169 | ||||
|
170 | (For example, a function in a library to compute square roots has | |||
|
171 | a purpose that is entirely well-defined independent of the | |||
|
172 | application. Therefore, Subsection 2d requires that any | |||
|
173 | application-supplied function or table used by this function must | |||
|
174 | be optional: if the application does not supply it, the square | |||
|
175 | root function must still compute square roots.) | |||
|
176 | ||||
|
177 | These requirements apply to the modified work as a whole. If | |||
|
178 | identifiable sections of that work are not derived from the Library, | |||
|
179 | and can be reasonably considered independent and separate works in | |||
|
180 | themselves, then this License, and its terms, do not apply to those | |||
|
181 | sections when you distribute them as separate works. But when you | |||
|
182 | distribute the same sections as part of a whole which is a work based | |||
|
183 | on the Library, the distribution of the whole must be on the terms of | |||
|
184 | this License, whose permissions for other licensees extend to the | |||
|
185 | entire whole, and thus to each and every part regardless of who wrote | |||
|
186 | it. | |||
|
187 | ||||
|
188 | Thus, it is not the intent of this section to claim rights or contest | |||
|
189 | your rights to work written entirely by you; rather, the intent is to | |||
|
190 | exercise the right to control the distribution of derivative or | |||
|
191 | collective works based on the Library. | |||
|
192 | ||||
|
193 | In addition, mere aggregation of another work not based on the Library | |||
|
194 | with the Library (or with a work based on the Library) on a volume of | |||
|
195 | a storage or distribution medium does not bring the other work under | |||
|
196 | the scope of this License. | |||
|
197 | ||||
|
198 | 3. You may opt to apply the terms of the ordinary GNU General Public | |||
|
199 | License instead of this License to a given copy of the Library. To do | |||
|
200 | this, you must alter all the notices that refer to this License, so | |||
|
201 | that they refer to the ordinary GNU General Public License, version 2, | |||
|
202 | instead of to this License. (If a newer version than version 2 of the | |||
|
203 | ordinary GNU General Public License has appeared, then you can specify | |||
|
204 | that version instead if you wish.) Do not make any other change in | |||
|
205 | these notices. | |||
|
206 | ||||
|
207 | Once this change is made in a given copy, it is irreversible for | |||
|
208 | that copy, so the ordinary GNU General Public License applies to all | |||
|
209 | subsequent copies and derivative works made from that copy. | |||
|
210 | ||||
|
211 | This option is useful when you wish to copy part of the code of | |||
|
212 | the Library into a program that is not a library. | |||
|
213 | ||||
|
214 | 4. You may copy and distribute the Library (or a portion or | |||
|
215 | derivative of it, under Section 2) in object code or executable form | |||
|
216 | under the terms of Sections 1 and 2 above provided that you accompany | |||
|
217 | it with the complete corresponding machine-readable source code, which | |||
|
218 | must be distributed under the terms of Sections 1 and 2 above on a | |||
|
219 | medium customarily used for software interchange. | |||
|
220 | ||||
|
221 | If distribution of object code is made by offering access to copy | |||
|
222 | from a designated place, then offering equivalent access to copy the | |||
|
223 | source code from the same place satisfies the requirement to | |||
|
224 | distribute the source code, even though third parties are not | |||
|
225 | compelled to copy the source along with the object code. | |||
|
226 | ||||
|
227 | 5. A program that contains no derivative of any portion of the | |||
|
228 | Library, but is designed to work with the Library by being compiled or | |||
|
229 | linked with it, is called a "work that uses the Library". Such a | |||
|
230 | work, in isolation, is not a derivative work of the Library, and | |||
|
231 | therefore falls outside the scope of this License. | |||
|
232 | ||||
|
233 | However, linking a "work that uses the Library" with the Library | |||
|
234 | creates an executable that is a derivative of the Library (because it | |||
|
235 | contains portions of the Library), rather than a "work that uses the | |||
|
236 | library". The executable is therefore covered by this License. | |||
|
237 | Section 6 states terms for distribution of such executables. | |||
|
238 | ||||
|
239 | When a "work that uses the Library" uses material from a header file | |||
|
240 | that is part of the Library, the object code for the work may be a | |||
|
241 | derivative work of the Library even though the source code is not. | |||
|
242 | Whether this is true is especially significant if the work can be | |||
|
243 | linked without the Library, or if the work is itself a library. The | |||
|
244 | threshold for this to be true is not precisely defined by law. | |||
|
245 | ||||
|
246 | If such an object file uses only numerical parameters, data | |||
|
247 | structure layouts and accessors, and small macros and small inline | |||
|
248 | functions (ten lines or less in length), then the use of the object | |||
|
249 | file is unrestricted, regardless of whether it is legally a derivative | |||
|
250 | work. (Executables containing this object code plus portions of the | |||
|
251 | Library will still fall under Section 6.) | |||
|
252 | ||||
|
253 | Otherwise, if the work is a derivative of the Library, you may | |||
|
254 | distribute the object code for the work under the terms of Section 6. | |||
|
255 | Any executables containing that work also fall under Section 6, | |||
|
256 | whether or not they are linked directly with the Library itself. | |||
|
257 | ||||
|
258 | 6. As an exception to the Sections above, you may also compile or | |||
|
259 | link a "work that uses the Library" with the Library to produce a | |||
|
260 | work containing portions of the Library, and distribute that work | |||
|
261 | under terms of your choice, provided that the terms permit | |||
|
262 | modification of the work for the customer's own use and reverse | |||
|
263 | engineering for debugging such modifications. | |||
|
264 | ||||
|
265 | You must give prominent notice with each copy of the work that the | |||
|
266 | Library is used in it and that the Library and its use are covered by | |||
|
267 | this License. You must supply a copy of this License. If the work | |||
|
268 | during execution displays copyright notices, you must include the | |||
|
269 | copyright notice for the Library among them, as well as a reference | |||
|
270 | directing the user to the copy of this License. Also, you must do one | |||
|
271 | of these things: | |||
|
272 | ||||
|
273 | a) Accompany the work with the complete corresponding | |||
|
274 | machine-readable source code for the Library including whatever | |||
|
275 | changes were used in the work (which must be distributed under | |||
|
276 | Sections 1 and 2 above); and, if the work is an executable linked | |||
|
277 | with the Library, with the complete machine-readable "work that | |||
|
278 | uses the Library", as object code and/or source code, so that the | |||
|
279 | user can modify the Library and then relink to produce a modified | |||
|
280 | executable containing the modified Library. (It is understood | |||
|
281 | that the user who changes the contents of definitions files in the | |||
|
282 | Library will not necessarily be able to recompile the application | |||
|
283 | to use the modified definitions.) | |||
|
284 | ||||
|
285 | b) Accompany the work with a written offer, valid for at | |||
|
286 | least three years, to give the same user the materials | |||
|
287 | specified in Subsection 6a, above, for a charge no more | |||
|
288 | than the cost of performing this distribution. | |||
|
289 | ||||
|
290 | c) If distribution of the work is made by offering access to copy | |||
|
291 | from a designated place, offer equivalent access to copy the above | |||
|
292 | specified materials from the same place. | |||
|
293 | ||||
|
294 | d) Verify that the user has already received a copy of these | |||
|
295 | materials or that you have already sent this user a copy. | |||
|
296 | ||||
|
297 | For an executable, the required form of the "work that uses the | |||
|
298 | Library" must include any data and utility programs needed for | |||
|
299 | reproducing the executable from it. However, as a special exception, | |||
|
300 | the source code distributed need not include anything that is normally | |||
|
301 | distributed (in either source or binary form) with the major | |||
|
302 | components (compiler, kernel, and so on) of the operating system on | |||
|
303 | which the executable runs, unless that component itself accompanies | |||
|
304 | the executable. | |||
|
305 | ||||
|
306 | It may happen that this requirement contradicts the license | |||
|
307 | restrictions of other proprietary libraries that do not normally | |||
|
308 | accompany the operating system. Such a contradiction means you cannot | |||
|
309 | use both them and the Library together in an executable that you | |||
|
310 | distribute. | |||
|
311 | ||||
|
312 | 7. You may place library facilities that are a work based on the | |||
|
313 | Library side-by-side in a single library together with other library | |||
|
314 | facilities not covered by this License, and distribute such a combined | |||
|
315 | library, provided that the separate distribution of the work based on | |||
|
316 | the Library and of the other library facilities is otherwise | |||
|
317 | permitted, and provided that you do these two things: | |||
|
318 | ||||
|
319 | a) Accompany the combined library with a copy of the same work | |||
|
320 | based on the Library, uncombined with any other library | |||
|
321 | facilities. This must be distributed under the terms of the | |||
|
322 | Sections above. | |||
|
323 | ||||
|
324 | b) Give prominent notice with the combined library of the fact | |||
|
325 | that part of it is a work based on the Library, and explaining | |||
|
326 | where to find the accompanying uncombined form of the same work. | |||
|
327 | ||||
|
328 | 8. You may not copy, modify, sublicense, link with, or distribute | |||
|
329 | the Library except as expressly provided under this License. Any | |||
|
330 | attempt otherwise to copy, modify, sublicense, link with, or | |||
|
331 | distribute the Library is void, and will automatically terminate your | |||
|
332 | rights under this License. However, parties who have received copies, | |||
|
333 | or rights, from you under this License will not have their licenses | |||
|
334 | terminated so long as such parties remain in full compliance. | |||
|
335 | ||||
|
336 | 9. You are not required to accept this License, since you have not | |||
|
337 | signed it. However, nothing else grants you permission to modify or | |||
|
338 | distribute the Library or its derivative works. These actions are | |||
|
339 | prohibited by law if you do not accept this License. Therefore, by | |||
|
340 | modifying or distributing the Library (or any work based on the | |||
|
341 | Library), you indicate your acceptance of this License to do so, and | |||
|
342 | all its terms and conditions for copying, distributing or modifying | |||
|
343 | the Library or works based on it. | |||
|
344 | ||||
|
345 | 10. Each time you redistribute the Library (or any work based on the | |||
|
346 | Library), the recipient automatically receives a license from the | |||
|
347 | original licensor to copy, distribute, link with or modify the Library | |||
|
348 | subject to these terms and conditions. You may not impose any further | |||
|
349 | restrictions on the recipients' exercise of the rights granted herein. | |||
|
350 | You are not responsible for enforcing compliance by third parties to | |||
|
351 | this License. | |||
|
352 | ||||
|
353 | 11. If, as a consequence of a court judgment or allegation of patent | |||
|
354 | infringement or for any other reason (not limited to patent issues), | |||
|
355 | conditions are imposed on you (whether by court order, agreement or | |||
|
356 | otherwise) that contradict the conditions of this License, they do not | |||
|
357 | excuse you from the conditions of this License. If you cannot | |||
|
358 | distribute so as to satisfy simultaneously your obligations under this | |||
|
359 | License and any other pertinent obligations, then as a consequence you | |||
|
360 | may not distribute the Library at all. For example, if a patent | |||
|
361 | license would not permit royalty-free redistribution of the Library by | |||
|
362 | all those who receive copies directly or indirectly through you, then | |||
|
363 | the only way you could satisfy both it and this License would be to | |||
|
364 | refrain entirely from distribution of the Library. | |||
|
365 | ||||
|
366 | If any portion of this section is held invalid or unenforceable under any | |||
|
367 | particular circumstance, the balance of the section is intended to apply, | |||
|
368 | and the section as a whole is intended to apply in other circumstances. | |||
|
369 | ||||
|
370 | It is not the purpose of this section to induce you to infringe any | |||
|
371 | patents or other property right claims or to contest validity of any | |||
|
372 | such claims; this section has the sole purpose of protecting the | |||
|
373 | integrity of the free software distribution system which is | |||
|
374 | implemented by public license practices. Many people have made | |||
|
375 | generous contributions to the wide range of software distributed | |||
|
376 | through that system in reliance on consistent application of that | |||
|
377 | system; it is up to the author/donor to decide if he or she is willing | |||
|
378 | to distribute software through any other system and a licensee cannot | |||
|
379 | impose that choice. | |||
|
380 | ||||
|
381 | This section is intended to make thoroughly clear what is believed to | |||
|
382 | be a consequence of the rest of this License. | |||
|
383 | ||||
|
384 | 12. If the distribution and/or use of the Library is restricted in | |||
|
385 | certain countries either by patents or by copyrighted interfaces, the | |||
|
386 | original copyright holder who places the Library under this License may add | |||
|
387 | an explicit geographical distribution limitation excluding those countries, | |||
|
388 | so that distribution is permitted only in or among countries not thus | |||
|
389 | excluded. In such case, this License incorporates the limitation as if | |||
|
390 | written in the body of this License. | |||
|
391 | ||||
|
392 | 13. The Free Software Foundation may publish revised and/or new | |||
|
393 | versions of the Library General Public License from time to time. | |||
|
394 | Such new versions will be similar in spirit to the present version, | |||
|
395 | but may differ in detail to address new problems or concerns. | |||
|
396 | ||||
|
397 | Each version is given a distinguishing version number. If the Library | |||
|
398 | specifies a version number of this License which applies to it and | |||
|
399 | "any later version", you have the option of following the terms and | |||
|
400 | conditions either of that version or of any later version published by | |||
|
401 | the Free Software Foundation. If the Library does not specify a | |||
|
402 | license version number, you may choose any version ever published by | |||
|
403 | the Free Software Foundation. | |||
|
404 | ||||
|
405 | 14. If you wish to incorporate parts of the Library into other free | |||
|
406 | programs whose distribution conditions are incompatible with these, | |||
|
407 | write to the author to ask for permission. For software which is | |||
|
408 | copyrighted by the Free Software Foundation, write to the Free | |||
|
409 | Software Foundation; we sometimes make exceptions for this. Our | |||
|
410 | decision will be guided by the two goals of preserving the free status | |||
|
411 | of all derivatives of our free software and of promoting the sharing | |||
|
412 | and reuse of software generally. | |||
|
413 | ||||
|
414 | NO WARRANTY | |||
|
415 | ||||
|
416 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO | |||
|
417 | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. | |||
|
418 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR | |||
|
419 | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY | |||
|
420 | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE | |||
|
421 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||
|
422 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE | |||
|
423 | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME | |||
|
424 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | |||
|
425 | ||||
|
426 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN | |||
|
427 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY | |||
|
428 | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU | |||
|
429 | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR | |||
|
430 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE | |||
|
431 | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING | |||
|
432 | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A | |||
|
433 | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF | |||
|
434 | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | |||
|
435 | DAMAGES. | |||
|
436 | ||||
|
437 | END OF TERMS AND CONDITIONS | |||
|
438 | ||||
|
439 | How to Apply These Terms to Your New Libraries | |||
|
440 | ||||
|
441 | If you develop a new library, and you want it to be of the greatest | |||
|
442 | possible use to the public, we recommend making it free software that | |||
|
443 | everyone can redistribute and change. You can do so by permitting | |||
|
444 | redistribution under these terms (or, alternatively, under the terms of the | |||
|
445 | ordinary General Public License). | |||
|
446 | ||||
|
447 | To apply these terms, attach the following notices to the library. It is | |||
|
448 | safest to attach them to the start of each source file to most effectively | |||
|
449 | convey the exclusion of warranty; and each file should have at least the | |||
|
450 | "copyright" line and a pointer to where the full notice is found. | |||
|
451 | ||||
|
452 | <one line to give the library's name and a brief idea of what it does.> | |||
|
453 | Copyright (C) <year> <name of author> | |||
|
454 | ||||
|
455 | This library is free software; you can redistribute it and/or | |||
|
456 | modify it under the terms of the GNU Library General Public | |||
|
457 | License as published by the Free Software Foundation; either | |||
|
458 | version 2 of the License, or (at your option) any later version. | |||
|
459 | ||||
|
460 | This library is distributed in the hope that it will be useful, | |||
|
461 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
462 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
463 | Library General Public License for more details. | |||
|
464 | ||||
|
465 | You should have received a copy of the GNU Library General Public | |||
|
466 | License along with this library; if not, write to the Free | |||
|
467 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
468 | ||||
|
469 | Also add information on how to contact you by electronic and paper mail. | |||
|
470 | ||||
|
471 | You should also get your employer (if you work as a programmer) or your | |||
|
472 | school, if any, to sign a "copyright disclaimer" for the library, if | |||
|
473 | necessary. Here is a sample; alter the names: | |||
|
474 | ||||
|
475 | Yoyodyne, Inc., hereby disclaims all copyright interest in the | |||
|
476 | library `Frob' (a library for tweaking knobs) written by James Random Hacker. | |||
|
477 | ||||
|
478 | <signature of Ty Coon>, 1 April 1990 | |||
|
479 | Ty Coon, President of Vice | |||
|
480 | ||||
|
481 | That's all there is to it! |
@@ -0,0 +1,176 | |||||
|
1 | Basic Installation | |||
|
2 | ================== | |||
|
3 | ||||
|
4 | These are generic installation instructions. | |||
|
5 | ||||
|
6 | The `configure' shell script attempts to guess correct values for | |||
|
7 | various system-dependent variables used during compilation. It uses | |||
|
8 | those values to create a `Makefile' in each directory of the package. | |||
|
9 | It may also create one or more `.h' files containing system-dependent | |||
|
10 | definitions. Finally, it creates a shell script `config.status' that | |||
|
11 | you can run in the future to recreate the current configuration, a file | |||
|
12 | `config.cache' that saves the results of its tests to speed up | |||
|
13 | reconfiguring, and a file `config.log' containing compiler output | |||
|
14 | (useful mainly for debugging `configure'). | |||
|
15 | ||||
|
16 | If you need to do unusual things to compile the package, please try | |||
|
17 | to figure out how `configure' could check whether to do them, and mail | |||
|
18 | diffs or instructions to the address given in the `README' so they can | |||
|
19 | be considered for the next release. If at some point `config.cache' | |||
|
20 | contains results you don't want to keep, you may remove or edit it. | |||
|
21 | ||||
|
22 | The file `configure.in' is used to create `configure' by a program | |||
|
23 | called `autoconf'. You only need `configure.in' if you want to change | |||
|
24 | it or regenerate `configure' using a newer version of `autoconf'. | |||
|
25 | ||||
|
26 | The simplest way to compile this package is: | |||
|
27 | ||||
|
28 | 1. `cd' to the directory containing the package's source code and type | |||
|
29 | `./configure' to configure the package for your system. If you're | |||
|
30 | using `csh' on an old version of System V, you might need to type | |||
|
31 | `sh ./configure' instead to prevent `csh' from trying to execute | |||
|
32 | `configure' itself. | |||
|
33 | ||||
|
34 | Running `configure' takes awhile. While running, it prints some | |||
|
35 | messages telling which features it is checking for. | |||
|
36 | ||||
|
37 | 2. Type `make' to compile the package. | |||
|
38 | ||||
|
39 | 3. Optionally, type `make check' to run any self-tests that come with | |||
|
40 | the package. | |||
|
41 | ||||
|
42 | 4. Type `make install' to install the programs and any data files and | |||
|
43 | documentation. | |||
|
44 | ||||
|
45 | 5. You can remove the program binaries and object files from the | |||
|
46 | source code directory by typing `make clean'. To also remove the | |||
|
47 | files that `configure' created (so you can compile the package for | |||
|
48 | a different kind of computer), type `make distclean'. There is | |||
|
49 | also a `make maintainer-clean' target, but that is intended mainly | |||
|
50 | for the package's developers. If you use it, you may have to get | |||
|
51 | all sorts of other programs in order to regenerate files that came | |||
|
52 | with the distribution. | |||
|
53 | ||||
|
54 | Compilers and Options | |||
|
55 | ===================== | |||
|
56 | ||||
|
57 | Some systems require unusual options for compilation or linking that | |||
|
58 | the `configure' script does not know about. You can give `configure' | |||
|
59 | initial values for variables by setting them in the environment. Using | |||
|
60 | a Bourne-compatible shell, you can do that on the command line like | |||
|
61 | this: | |||
|
62 | CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure | |||
|
63 | ||||
|
64 | Or on systems that have the `env' program, you can do it like this: | |||
|
65 | env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure | |||
|
66 | ||||
|
67 | Compiling For Multiple Architectures | |||
|
68 | ==================================== | |||
|
69 | ||||
|
70 | You can compile the package for more than one kind of computer at the | |||
|
71 | same time, by placing the object files for each architecture in their | |||
|
72 | own directory. To do this, you must use a version of `make' that | |||
|
73 | supports the `VPATH' variable, such as GNU `make'. `cd' to the | |||
|
74 | directory where you want the object files and executables to go and run | |||
|
75 | the `configure' script. `configure' automatically checks for the | |||
|
76 | source code in the directory that `configure' is in and in `..'. | |||
|
77 | ||||
|
78 | If you have to use a `make' that does not supports the `VPATH' | |||
|
79 | variable, you have to compile the package for one architecture at a time | |||
|
80 | in the source code directory. After you have installed the package for | |||
|
81 | one architecture, use `make distclean' before reconfiguring for another | |||
|
82 | architecture. | |||
|
83 | ||||
|
84 | Installation Names | |||
|
85 | ================== | |||
|
86 | ||||
|
87 | By default, `make install' will install the package's files in | |||
|
88 | `/usr/local/bin', `/usr/local/man', etc. You can specify an | |||
|
89 | installation prefix other than `/usr/local' by giving `configure' the | |||
|
90 | option `--prefix=PATH'. | |||
|
91 | ||||
|
92 | You can specify separate installation prefixes for | |||
|
93 | architecture-specific files and architecture-independent files. If you | |||
|
94 | give `configure' the option `--exec-prefix=PATH', the package will use | |||
|
95 | PATH as the prefix for installing programs and libraries. | |||
|
96 | Documentation and other data files will still use the regular prefix. | |||
|
97 | ||||
|
98 | If the package supports it, you can cause programs to be installed | |||
|
99 | with an extra prefix or suffix on their names by giving `configure' the | |||
|
100 | option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. | |||
|
101 | ||||
|
102 | Optional Features | |||
|
103 | ================= | |||
|
104 | ||||
|
105 | Some packages pay attention to `--enable-FEATURE' options to | |||
|
106 | `configure', where FEATURE indicates an optional part of the package. | |||
|
107 | They may also pay attention to `--with-PACKAGE' options, where PACKAGE | |||
|
108 | is something like `gnu-as' or `x' (for the X Window System). The | |||
|
109 | `README' should mention any `--enable-' and `--with-' options that the | |||
|
110 | package recognizes. | |||
|
111 | ||||
|
112 | For packages that use the X Window System, `configure' can usually | |||
|
113 | find the X include and library files automatically, but if it doesn't, | |||
|
114 | you can use the `configure' options `--x-includes=DIR' and | |||
|
115 | `--x-libraries=DIR' to specify their locations. | |||
|
116 | ||||
|
117 | Specifying the System Type | |||
|
118 | ========================== | |||
|
119 | ||||
|
120 | There may be some features `configure' can not figure out | |||
|
121 | automatically, but needs to determine by the type of host the package | |||
|
122 | will run on. Usually `configure' can figure that out, but if it prints | |||
|
123 | a message saying it can not guess the host type, give it the | |||
|
124 | `--host=TYPE' option. TYPE can either be a short name for the system | |||
|
125 | type, such as `sun4', or a canonical name with three fields: | |||
|
126 | CPU-COMPANY-SYSTEM | |||
|
127 | ||||
|
128 | See the file `config.sub' for the possible values of each field. If | |||
|
129 | `config.sub' isn't included in this package, then this package doesn't | |||
|
130 | need to know the host type. | |||
|
131 | ||||
|
132 | If you are building compiler tools for cross-compiling, you can also | |||
|
133 | use the `--target=TYPE' option to select the type of system they will | |||
|
134 | produce code for and the `--build=TYPE' option to select the type of | |||
|
135 | system on which you are compiling the package. | |||
|
136 | ||||
|
137 | Sharing Defaults | |||
|
138 | ================ | |||
|
139 | ||||
|
140 | If you want to set default values for `configure' scripts to share, | |||
|
141 | you can create a site shell script called `config.site' that gives | |||
|
142 | default values for variables like `CC', `cache_file', and `prefix'. | |||
|
143 | `configure' looks for `PREFIX/share/config.site' if it exists, then | |||
|
144 | `PREFIX/etc/config.site' if it exists. Or, you can set the | |||
|
145 | `CONFIG_SITE' environment variable to the location of the site script. | |||
|
146 | A warning: not all `configure' scripts look for a site script. | |||
|
147 | ||||
|
148 | Operation Controls | |||
|
149 | ================== | |||
|
150 | ||||
|
151 | `configure' recognizes the following options to control how it | |||
|
152 | operates. | |||
|
153 | ||||
|
154 | `--cache-file=FILE' | |||
|
155 | Use and save the results of the tests in FILE instead of | |||
|
156 | `./config.cache'. Set FILE to `/dev/null' to disable caching, for | |||
|
157 | debugging `configure'. | |||
|
158 | ||||
|
159 | `--help' | |||
|
160 | Print a summary of the options to `configure', and exit. | |||
|
161 | ||||
|
162 | `--quiet' | |||
|
163 | `--silent' | |||
|
164 | `-q' | |||
|
165 | Do not print messages saying which checks are being made. | |||
|
166 | ||||
|
167 | `--srcdir=DIR' | |||
|
168 | Look for the package's source code in directory DIR. Usually | |||
|
169 | `configure' can determine that directory automatically. | |||
|
170 | ||||
|
171 | `--version' | |||
|
172 | Print the version of Autoconf used to generate the `configure' | |||
|
173 | script, and exit. | |||
|
174 | ||||
|
175 | `configure' also accepts some other, not widely useful, options. | |||
|
176 |
@@ -0,0 +1,96 | |||||
|
1 | 25275 COPYING.LIB | |||
|
2 | 35406 ChangeLog | |||
|
3 | 7462 INSTALL | |||
|
4 | 5908 Makefile.in | |||
|
5 | 13232 README | |||
|
6 | 7 VERSION | |||
|
7 | 2955 acconfig.h | |||
|
8 | 9381 aclocal.m4 | |||
|
9 | 43611 config.guess | |||
|
10 | 3987 config.h.in | |||
|
11 | 31160 config.sub | |||
|
12 | 110753 configure | |||
|
13 | 11736 configure.in | |||
|
14 | 2186 install-sh | |||
|
15 | 4798 lib/32.fsize.c | |||
|
16 | 1556 lib/32.getehdr.c | |||
|
17 | 1557 lib/32.getphdr.c | |||
|
18 | 1665 lib/32.getshdr.c | |||
|
19 | 2181 lib/32.newehdr.c | |||
|
20 | 3055 lib/32.newphdr.c | |||
|
21 | 12322 lib/32.xlatetof.c | |||
|
22 | 14221 lib/64.xlatetof.c | |||
|
23 | 8012 lib/Makefile.in | |||
|
24 | 4010 lib/Makefile.w32 | |||
|
25 | 1119 lib/assert.c | |||
|
26 | 10463 lib/begin.c | |||
|
27 | 1685 lib/build.bat | |||
|
28 | 3566 lib/byteswap.h | |||
|
29 | 3937 lib/checksum.c | |||
|
30 | 1901 lib/cntl.c | |||
|
31 | 4851 lib/config.h.w32 | |||
|
32 | 12554 lib/cook.c | |||
|
33 | 1183 lib/data.c | |||
|
34 | 24585 lib/elf_repl.h | |||
|
35 | 2899 lib/end.c | |||
|
36 | 2137 lib/errmsg.c | |||
|
37 | 1037 lib/errno.c | |||
|
38 | 6222 lib/errors.h | |||
|
39 | 8107 lib/ext_types.h | |||
|
40 | 997 lib/fill.c | |||
|
41 | 2400 lib/flag.c | |||
|
42 | 5103 lib/gelf.h | |||
|
43 | 4151 lib/gelfehdr.c | |||
|
44 | 3965 lib/gelfphdr.c | |||
|
45 | 3758 lib/gelfshdr.c | |||
|
46 | 9456 lib/gelftrans.c | |||
|
47 | 1175 lib/getarhdr.c | |||
|
48 | 1380 lib/getaroff.c | |||
|
49 | 2421 lib/getarsym.c | |||
|
50 | 1096 lib/getbase.c | |||
|
51 | 3841 lib/getdata.c | |||
|
52 | 1353 lib/getident.c | |||
|
53 | 1449 lib/getscn.c | |||
|
54 | 1212 lib/hash.c | |||
|
55 | 2562 lib/input.c | |||
|
56 | 1088 lib/kind.c | |||
|
57 | 1214 lib/libelf.def | |||
|
58 | 9050 lib/libelf.h | |||
|
59 | 1505 lib/memset.c | |||
|
60 | 1098 lib/ndxscn.c | |||
|
61 | 1558 lib/newdata.c | |||
|
62 | 3488 lib/newscn.c | |||
|
63 | 1356 lib/next.c | |||
|
64 | 1607 lib/nextscn.c | |||
|
65 | 5898 lib/nlist.c | |||
|
66 | 1452 lib/nlist.h | |||
|
67 | 5071 lib/opt.delscn.c | |||
|
68 | 13133 lib/private.h | |||
|
69 | 1286 lib/rand.c | |||
|
70 | 2543 lib/rawdata.c | |||
|
71 | 1541 lib/rawfile.c | |||
|
72 | 3393 lib/strptr.c | |||
|
73 | 2285 lib/swap64.c | |||
|
74 | 3812 lib/sys_elf.h.in | |||
|
75 | 4066 lib/sys_elf.h.w32 | |||
|
76 | 26008 lib/update.c | |||
|
77 | 6884 lib/verdef.h | |||
|
78 | 1586 lib/verdef_32_tof.c | |||
|
79 | 1586 lib/verdef_32_tom.c | |||
|
80 | 1614 lib/verdef_64_tof.c | |||
|
81 | 1614 lib/verdef_64_tom.c | |||
|
82 | 7135 lib/verneed.h | |||
|
83 | 1435 lib/version.c | |||
|
84 | 4425 lib/x.elfext.c | |||
|
85 | 2721 lib/x.movscn.c | |||
|
86 | 2870 lib/x.remscn.c | |||
|
87 | 254 libelf.pc.in | |||
|
88 | 619 mkinstalldirs | |||
|
89 | 4593 po/Makefile.in | |||
|
90 | 8748 po/de.gmo | |||
|
91 | 52 po/de.msg | |||
|
92 | 11332 po/de.po | |||
|
93 | 3011 po/gmo2msg.c | |||
|
94 | 6483 po/libelf.pot | |||
|
95 | 10 po/stamp-po | |||
|
96 | 10 stamp-h.in |
@@ -0,0 +1,332 | |||||
|
1 | This is the public release of libelf-0.8.13, a free ELF object | |||
|
2 | file access library. If you have problems with applications | |||
|
3 | that use libelf and work with the commercial (SVR4, Solaris) | |||
|
4 | version but not with this one, please contact me. | |||
|
5 | ||||
|
6 | IMPORTANT NOTE: If you have libelf-0.5.2 installed, you probably | |||
|
7 | have a file .../include/elf.h that contains the single line | |||
|
8 | ``#include <libelf/elf.h>''. REMOVE THIS FILE BEFORE YOU RUN | |||
|
9 | configure. | |||
|
10 | ||||
|
11 | Installation is straightforward - the package is autoconf'ed. Just do | |||
|
12 | ``cd libelf-0.8.13; ./configure; make; make install''. Header files | |||
|
13 | will be installed in .../include/libelf/. If your system does not | |||
|
14 | provide its own versions of libelf.h, nlist.h or gelf.h, ``make | |||
|
15 | install'' will add the missing headers. If you prefer not to have | |||
|
16 | these files installed in /usr/include, use ``--disable-compat'' and | |||
|
17 | add ``-I /usr/include/libelf'' to your CFLAGS when compiling | |||
|
18 | libelf-based programs. | |||
|
19 | ||||
|
20 | Note to distribution makers: You can install libelf in a separate root | |||
|
21 | hierarchy by using the command ``make instroot=/my/root install''. | |||
|
22 | You should also use the ``--enable-compat'' configure option in that | |||
|
23 | case, or run ``make instroot=/my/root install-compat'' manually, to | |||
|
24 | install all the required header files. | |||
|
25 | ||||
|
26 | If you are running Linux with libc 5.* as the default C library, | |||
|
27 | and you plan to use the 64-bit functions, you must either use | |||
|
28 | ``-I.../include/libelf'', or remove /usr/include/libelf.h and use | |||
|
29 | ``--enable-compat'' when running configure. Libc 6.* (aka glibc2) | |||
|
30 | doesn't have its own <libelf.h>, <nlist.h> or <gelf.h>. | |||
|
31 | ||||
|
32 | You need an ANSI/ISO C compiler to build libelf. Gcc is optimal. | |||
|
33 | ||||
|
34 | On some systems (in particular, Solaris and all variants of Linux), | |||
|
35 | ``make'' will try to build a shared library. If you run into problems | |||
|
36 | on your system, please pass ``--disable-shared'' to configure. | |||
|
37 | If you build a shared library and want it to be installed as | |||
|
38 | ``libelf-0.8.13.so'' rather than ``libelf.so.0.8.13'', please use | |||
|
39 | ``./configure --enable-gnu-names''. Other files, e.g. ``libelf.so'' and | |||
|
40 | ``libelf.so.0'' are NOT affected. | |||
|
41 | ||||
|
42 | Another configure option, ``--enable-debug'', adds debugging code to | |||
|
43 | libelf; if you don't run into problems, you will probably not need it. | |||
|
44 | ||||
|
45 | When creating an ELF shared library, it is possible to add references | |||
|
46 | to other shared libraries in the DYNAMIC section of the resulting | |||
|
47 | file. The make variable DEPSHLIBS contains a list of libraries to add. | |||
|
48 | It is set to ``-lc'' on Linux systems, and empty otherwise. To | |||
|
49 | override this setting, use something like ``make DEPSHLIBS="-la -lb"''. | |||
|
50 | For Linux, `-lc' is included automagically. | |||
|
51 | ||||
|
52 | NLS is available and enabled by default. To turn it off, pass the | |||
|
53 | ``--disable-nls'' option to configure. | |||
|
54 | ||||
|
55 | Libelf can use gettext or catgets for accessing message | |||
|
56 | catalogs. If gettext is available AND is part of libc (i.e. not | |||
|
57 | in a separate library), it will be used. Otherwise, configure | |||
|
58 | will look for catgets. If you have gettext in a separate | |||
|
59 | library and want to use it, you should pass the library's name | |||
|
60 | to configure, e.g. ``LIBS=-lintl ./configure''. Note that you | |||
|
61 | MUST link your libelf-based applications with -lintl then, | |||
|
62 | which is probably not what you want, or change the DEPSHLIBS variable | |||
|
63 | described above (in case you're building a shared library). | |||
|
64 | ||||
|
65 | If you have GNU gettext 0.10 installed on your system, and if GNU gettext | |||
|
66 | runs on top of the catgets interface (rather old Linux systems, using | |||
|
67 | libc5), configure will refuse to use it and use catgets instead. If you | |||
|
68 | absolutely want to use GNU gettext, go ahead and rebuild it (which is | |||
|
69 | IMHO a good idea in general in this case): | |||
|
70 | ||||
|
71 | cd .../gettext-0.10 | |||
|
72 | ac_cv_func_catgets=no ac_cv_func_gettext=no ./configure | |||
|
73 | make | |||
|
74 | make install | |||
|
75 | ||||
|
76 | After that, return to the libelf build directory, remove | |||
|
77 | config.cache, and start over. | |||
|
78 | ||||
|
79 | *** Large File Support (LFS) applications *** | |||
|
80 | ||||
|
81 | Some 32-bit systems support files that are larger than the address space | |||
|
82 | of the architecture. On these, the `off_t' data type may have 32 or | |||
|
83 | 64 bits, depending on the API you choose. Since off_t is also part of | |||
|
84 | the libelf API, in particular the Elf_Data and Elf_Arhdr structures, | |||
|
85 | an application compiled with large file support will need a version of | |||
|
86 | libelf that has also been compiled with LFS; otherwise, it won't work | |||
|
87 | correctly. Similarly, a program compiled without LFS needs a library | |||
|
88 | compiled without LFS. | |||
|
89 | ||||
|
90 | Note that libelf is currently unable to process large files on 32-bit | |||
|
91 | architectures, whether you compile it for LFS or not, for the simple | |||
|
92 | reason that the files won't fit into the processes' address space. | |||
|
93 | Therefore, libelf is compiled without LFS by default. It can of course | |||
|
94 | read and write ELF files for 64-bit architectures, but they will be | |||
|
95 | limited in length on a 32-bit system. | |||
|
96 | ||||
|
97 | You may compile libelf with large file support by setting CPPFLAGS at | |||
|
98 | configuration time: | |||
|
99 | ||||
|
100 | CPPFLAGS=`getconf LFS_CFLAGS` ./configure | |||
|
101 | ||||
|
102 | But I really, really recommend you don't, because it breaks binary | |||
|
103 | compatibility with existing libelf based applications. | |||
|
104 | ||||
|
105 | *** 64-bit support *** | |||
|
106 | ||||
|
107 | Starting with libelf-0.7.0, libelf also supports 64-bit ELF files. | |||
|
108 | This is enabled by default unless your system (or your compiler) does | |||
|
109 | not support 64-bit integers, or lacks 64-bit declarations in <elf.h>. | |||
|
110 | If you have problems building with 64-bit support, please do | |||
|
111 | ||||
|
112 | ./configure --disable-elf64 | |||
|
113 | ||||
|
114 | for the moment, and contact me. Please note that I haven't tested 64-bit | |||
|
115 | support much. There are still some unresolved problems, e.g. IRIX | |||
|
116 | uses different Elf64_Rel and Elf64_Rela structures (they replaced the | |||
|
117 | r_info member), and the enumeration values for Elf_Type differ from | |||
|
118 | the commercial (SVR4) implementation of libelf - they broke binary | |||
|
119 | compatibility for no good reason, and I'm not willing to follow their | |||
|
120 | footsteps. The result is that libelf-0.7.* ist upward compatible with | |||
|
121 | libelf-0.6.4 (as it should be) but INCOMPATIBLE WITH SVR4 LIBELF. If you | |||
|
122 | have both versions installed, you'd better make sure that you link with | |||
|
123 | the library that matches the <libelf.h> you're #include'ing. | |||
|
124 | ||||
|
125 | *** Symbol Versioning *** | |||
|
126 | ||||
|
127 | Libelf >= 0.8.0 supports the data structures and definitions used for | |||
|
128 | symbol versioning on Solaris and Linux, in particular, the Elfxx_Verdef, | |||
|
129 | Elfxx_Verdaux, Elfxx_Verneed, Elfxx_Vernaux and Elfxx_Versym structures | |||
|
130 | and the SHT_XXX_verdef, SHT_XXX_verneed and SHT_XXX_versym section types | |||
|
131 | (where `xx' is either `32' or `64', and `XXX' is either `SUNW' or `GNU'). | |||
|
132 | Libelf now translates versioning sections to/from their external | |||
|
133 | representation properly (earlier versions left them in `raw' format, | |||
|
134 | with the data type set to ELF_T_BYTE). This may cause problems on | |||
|
135 | systems which use the same (OS-specific) section types for different | |||
|
136 | purposes. The configure program tries to figure out if your OS uses | |||
|
137 | versioning; if that check fails, you can use | |||
|
138 | ||||
|
139 | ./configure --disable-versioning | |||
|
140 | ||||
|
141 | to turn off versioning translation support. | |||
|
142 | ||||
|
143 | *** W32 Support *** | |||
|
144 | ||||
|
145 | There is now some support for building on W32 systems (requires Microsoft | |||
|
146 | VC++). In order to build a W32 DLL, cd into the `lib' subdirectory, edit | |||
|
147 | build.bat if necessary (it needs the path to your compiler binaries) and | |||
|
148 | run it. If you're lucky, libelf.dll and the import/export libraries will | |||
|
149 | be built. If not, please drop me a line. | |||
|
150 | ||||
|
151 | I tested it on XP Pro (SP2), using VC++ 2005 Express Edition. | |||
|
152 | Apparently, Visual Studio .NET 2003 works fine as well. | |||
|
153 | ||||
|
154 | Various notes regarding the W32 port: | |||
|
155 | ||||
|
156 | - When you open() an ELF file, remember to use the O_BINARY flag. | |||
|
157 | - You may have to add /MD to the linker command line. | |||
|
158 | ||||
|
159 | *** Missing things *** | |||
|
160 | ||||
|
161 | * There is no documentation. You can use the Solaris | |||
|
162 | manpages instead (available at http://docs.sun.com/). | |||
|
163 | The ELF file format is described in several places; | |||
|
164 | among them Suns "Linker and Libraries Guide" and the | |||
|
165 | "System V Application Binary Interface" documents; | |||
|
166 | http://www.caldera.com/developer/devspecs/gabi41.pdf and | |||
|
167 | http://www.caldera.com/developer/gabi/ are probably good | |||
|
168 | starting points. Processor-specific documentation is spread | |||
|
169 | across a number of `Processor Supplement' documents, one | |||
|
170 | for each architecture; you'll have to use a search engine to | |||
|
171 | find them. | |||
|
172 | ||||
|
173 | * The COFF file format is not understood. This is so obsolete | |||
|
174 | that it will probably never be implemented. | |||
|
175 | ||||
|
176 | * nlist(3) is incomplete; the n_type and n_sclass | |||
|
177 | members of struct nl are set to zero even if type | |||
|
178 | (that is, debug) information is available. | |||
|
179 | ||||
|
180 | * Libelf does not translate Solaris' `Move' and `Syminfo' | |||
|
181 | sections. You can read them using elf_getdata(), but you'll | |||
|
182 | only get raw (untranslated) bytes. | |||
|
183 | ||||
|
184 | Changes since 0.8.12: | |||
|
185 | ||||
|
186 | * New function elf_getaroff(). | |||
|
187 | ||||
|
188 | * Build fixes. | |||
|
189 | ||||
|
190 | Changes since 0.8.11: | |||
|
191 | ||||
|
192 | * Due to some unfortunate confusion, the elf_getphnum(), | |||
|
193 | elf_getshnum() and elf_getshstrndx() are not compatible | |||
|
194 | between libelf implementations. Therefore, the developers | |||
|
195 | decided to replace them with new functions: elf_getphdrnum(), | |||
|
196 | elf_getshdrnum() and elf_getshdrstrndx(), which will always | |||
|
197 | return -1 on failure and 0 on success. Code using the old | |||
|
198 | interface should be upgraded to increase portability. | |||
|
199 | ||||
|
200 | Changes since 0.8.10: | |||
|
201 | ||||
|
202 | * Fixed a bug in elf_rawfile(). | |||
|
203 | * If you use ELF_F_LAYOUT together with ELF_F_LAYOUT_OVERLAP, | |||
|
204 | elf_update() will now tolerate overlapping sections. | |||
|
205 | ||||
|
206 | Changes since 0.8.9: | |||
|
207 | ||||
|
208 | * Ported to QNX Neutrino. | |||
|
209 | * Fixed Windows build errors. | |||
|
210 | * Parallel (make -j) installation should work now. | |||
|
211 | ||||
|
212 | * It's now possible to enable and disable select sanity checks | |||
|
213 | libelf performs. Currently, this affects the "NUL terminated | |||
|
214 | string table entry" check performed in elf_strptr(). By | |||
|
215 | default, the function will return an error if the string | |||
|
216 | requested is not properly terminated - because some | |||
|
217 | applications might dump core otherwise. If you configure | |||
|
218 | libelf with `--disable-sanity-checks', however, the check | |||
|
219 | (and, in the future, probably others as well) is disabled | |||
|
220 | by default. You can still turn it on and off at runtime by | |||
|
221 | setting the LIBELF_SANITY_CHECKS environment variable to | |||
|
222 | an integer value: | |||
|
223 | ||||
|
224 | # disable all sanity checks | |||
|
225 | export LIBELF_SANITY_CHECKS=0 | |||
|
226 | ||||
|
227 | # enable all sanity checks | |||
|
228 | export LIBELF_SANITY_CHECKS=-1 | |||
|
229 | ||||
|
230 | Each bit of the value corresponds to a particular check, | |||
|
231 | so you could use LIBELF_SANITY_CHECKS=1 to enable only | |||
|
232 | the elf_strptr() check. You may also use a value in hex | |||
|
233 | (0x...) or octal (0...) format. | |||
|
234 | ||||
|
235 | Changes since 0.8.8: | |||
|
236 | ||||
|
237 | * Improved translator for symbol versioning sections. | |||
|
238 | * The W32 library is now built in the `lib' subdirectory. | |||
|
239 | * Windows DLLs should work now. | |||
|
240 | ||||
|
241 | Changes since 0.8.6: | |||
|
242 | ||||
|
243 | * added elf_getphnum(). | |||
|
244 | * added elf_getshnum(). | |||
|
245 | * added elf_getshstrndx(). | |||
|
246 | * added elfx_update_shstrndx(). | |||
|
247 | * handle interrupted reads/writes more gracefully. | |||
|
248 | * added (partial) support for unusual e_[ps]hentsize values. | |||
|
249 | * fixed the bugs introduced in 0.8.7. | |||
|
250 | ||||
|
251 | Changes since 0.8.5: | |||
|
252 | ||||
|
253 | * added W32 support. | |||
|
254 | * added workaround for alignment errors in archive members. | |||
|
255 | * my email address has changed again ;) | |||
|
256 | ||||
|
257 | Changes since 0.8.4: | |||
|
258 | ||||
|
259 | * elf_strptr() should now work more safely with fragmented | |||
|
260 | or badly formatted string tables. | |||
|
261 | ||||
|
262 | Changes since 0.8.3: | |||
|
263 | ||||
|
264 | * Fixed a bug in elf_update() that was introduced in 0.8.3. | |||
|
265 | ||||
|
266 | Changes since 0.8.2: | |||
|
267 | ||||
|
268 | * Should compile on MacOSX now. | |||
|
269 | ||||
|
270 | * Can read and write files with more than 65280 sections | |||
|
271 | ||||
|
272 | * Tries to handle 64-bit ELF files that use 8-byte hash table | |||
|
273 | entries. In particular, libelf tries to guess the data type in | |||
|
274 | elf_getdata(), and doesn't override sh_entsize in elf_update() | |||
|
275 | any longer. If you want the library to pick the entry size, | |||
|
276 | you must set its value to 0 before you call elf_update(). | |||
|
277 | ||||
|
278 | * No longer dumps core in elf_update() when a versioning section | |||
|
279 | has no data. Instead, it returns an error message. Note that | |||
|
280 | you're supposed to provide a valid d_buf for any section, unless | |||
|
281 | it's empty or has SHT_NOBITS type. | |||
|
282 | ||||
|
283 | * Building a shared library is now the default (if supported). | |||
|
284 | ||||
|
285 | Changes since 0.8.0: | |||
|
286 | ||||
|
287 | * Corrected typo in lib/{32,64}.xlatetof.c that sometimes | |||
|
288 | caused a compilation failure. | |||
|
289 | ||||
|
290 | * Use open(name, O_RDONLY|O_BINARY) in lib/nlist.c. | |||
|
291 | ||||
|
292 | Changes since 0.7.0: | |||
|
293 | ||||
|
294 | * I implemented the gelf_* interface, as found on Solaris. | |||
|
295 | I don't know whether it's compatible -- the Solaris manpage | |||
|
296 | isn't very specific, so I had to guess return values etc. in | |||
|
297 | some cases. | |||
|
298 | ||||
|
299 | * Added elf{32,64}_checksum (supposed to be compatible with | |||
|
300 | Solaris). | |||
|
301 | ||||
|
302 | * Added symbol versioning support. | |||
|
303 | ||||
|
304 | Changes since 0.6.4: | |||
|
305 | ||||
|
306 | * Fixed configure for IRIX systems | |||
|
307 | * Added check for truncated archive members | |||
|
308 | * Added check for misaligned SHDR/PHDR tables | |||
|
309 | * Support for building libelf together with GNU libc | |||
|
310 | * Added elf_memory(3) | |||
|
311 | * Added 64-bit support | |||
|
312 | ||||
|
313 | Changes since 0.5.2: | |||
|
314 | ||||
|
315 | * some bug fixes | |||
|
316 | * mmap support | |||
|
317 | * new directory layout | |||
|
318 | * There is a new function, elf_delscn(), that deletes | |||
|
319 | a section from an ELF file. It also adjusts the | |||
|
320 | sh_link and sh_info members in the section header | |||
|
321 | table, if (and ONLY if) the ELF standard indicates | |||
|
322 | that these values are section indices. References | |||
|
323 | to the deleted section will be cleared, so be careful. | |||
|
324 | * my email address has changed ;) | |||
|
325 | ||||
|
326 | Where to get libelf: | |||
|
327 | ||||
|
328 | ftp://ftp.ibiblio.org/pub/Linux/libs/ | |||
|
329 | http://www.mr511.de/software/ | |||
|
330 | ||||
|
331 | Michael "Tired" Riepe | |||
|
332 | <libelf@mr511.de> |
@@ -0,0 +1,1 | |||||
|
1 | 0.8.13 |
@@ -0,0 +1,95 | |||||
|
1 | /* | |||
|
2 | byteswap.h - functions and macros for byte swapping. | |||
|
3 | Copyright (C) 1995 - 2001 Michael Riepe | |||
|
4 | ||||
|
5 | This library is free software; you can redistribute it and/or | |||
|
6 | modify it under the terms of the GNU Library General Public | |||
|
7 | License as published by the Free Software Foundation; either | |||
|
8 | version 2 of the License, or (at your option) any later version. | |||
|
9 | ||||
|
10 | This library is distributed in the hope that it will be useful, | |||
|
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | Library General Public License for more details. | |||
|
14 | ||||
|
15 | You should have received a copy of the GNU Library General Public | |||
|
16 | License along with this library; if not, write to the Free Software | |||
|
17 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | /* @(#) $Id: byteswap.h,v 1.7 2008/05/23 08:15:34 michael Exp $ */ | |||
|
21 | ||||
|
22 | #ifndef _BYTESWAP_H | |||
|
23 | #define _BYTESWAP_H | |||
|
24 | ||||
|
25 | #define lu(from,i,s) (((__libelf_u32_t)((unsigned char*)(from))[i])<<(s)) | |||
|
26 | #define li(from,i,s) (((__libelf_i32_t)(( signed char*)(from))[i])<<(s)) | |||
|
27 | ||||
|
28 | #define __load_u16L(from) ((__libelf_u32_t) \ | |||
|
29 | (lu(from,1,8) | lu(from,0,0))) | |||
|
30 | #define __load_u16M(from) ((__libelf_u32_t) \ | |||
|
31 | (lu(from,0,8) | lu(from,1,0))) | |||
|
32 | #define __load_i16L(from) ((__libelf_i32_t) \ | |||
|
33 | (li(from,1,8) | lu(from,0,0))) | |||
|
34 | #define __load_i16M(from) ((__libelf_i32_t) \ | |||
|
35 | (li(from,0,8) | lu(from,1,0))) | |||
|
36 | ||||
|
37 | #define __load_u32L(from) ((__libelf_u32_t) \ | |||
|
38 | (lu(from,3,24) | lu(from,2,16) | lu(from,1,8) | lu(from,0,0))) | |||
|
39 | #define __load_u32M(from) ((__libelf_u32_t) \ | |||
|
40 | (lu(from,0,24) | lu(from,1,16) | lu(from,2,8) | lu(from,3,0))) | |||
|
41 | #define __load_i32L(from) ((__libelf_i32_t) \ | |||
|
42 | (li(from,3,24) | lu(from,2,16) | lu(from,1,8) | lu(from,0,0))) | |||
|
43 | #define __load_i32M(from) ((__libelf_i32_t) \ | |||
|
44 | (li(from,0,24) | lu(from,1,16) | lu(from,2,8) | lu(from,3,0))) | |||
|
45 | ||||
|
46 | #define su(to,i,v,s) (((char*)(to))[i]=((__libelf_u32_t)(v)>>(s))) | |||
|
47 | #define si(to,i,v,s) (((char*)(to))[i]=((__libelf_i32_t)(v)>>(s))) | |||
|
48 | ||||
|
49 | #define __store_u16L(to,v) \ | |||
|
50 | (su(to,1,v,8), su(to,0,v,0)) | |||
|
51 | #define __store_u16M(to,v) \ | |||
|
52 | (su(to,0,v,8), su(to,1,v,0)) | |||
|
53 | #define __store_i16L(to,v) \ | |||
|
54 | (si(to,1,v,8), si(to,0,v,0)) | |||
|
55 | #define __store_i16M(to,v) \ | |||
|
56 | (si(to,0,v,8), si(to,1,v,0)) | |||
|
57 | ||||
|
58 | #define __store_u32L(to,v) \ | |||
|
59 | (su(to,3,v,24), su(to,2,v,16), su(to,1,v,8), su(to,0,v,0)) | |||
|
60 | #define __store_u32M(to,v) \ | |||
|
61 | (su(to,0,v,24), su(to,1,v,16), su(to,2,v,8), su(to,3,v,0)) | |||
|
62 | #define __store_i32L(to,v) \ | |||
|
63 | (si(to,3,v,24), si(to,2,v,16), si(to,1,v,8), si(to,0,v,0)) | |||
|
64 | #define __store_i32M(to,v) \ | |||
|
65 | (si(to,0,v,24), si(to,1,v,16), si(to,2,v,8), si(to,3,v,0)) | |||
|
66 | ||||
|
67 | #if __LIBELF64 | |||
|
68 | ||||
|
69 | /* | |||
|
70 | * conversion functions from swap64.c | |||
|
71 | */ | |||
|
72 | extern __libelf_u64_t _elf_load_u64L(const unsigned char *from); | |||
|
73 | extern __libelf_u64_t _elf_load_u64M(const unsigned char *from); | |||
|
74 | extern __libelf_i64_t _elf_load_i64L(const unsigned char *from); | |||
|
75 | extern __libelf_i64_t _elf_load_i64M(const unsigned char *from); | |||
|
76 | extern void _elf_store_u64L(unsigned char *to, __libelf_u64_t v); | |||
|
77 | extern void _elf_store_u64M(unsigned char *to, __libelf_u64_t v); | |||
|
78 | extern void _elf_store_i64L(unsigned char *to, __libelf_u64_t v); | |||
|
79 | extern void _elf_store_i64M(unsigned char *to, __libelf_u64_t v); | |||
|
80 | ||||
|
81 | /* | |||
|
82 | * aliases for existing conversion code | |||
|
83 | */ | |||
|
84 | #define __load_u64L _elf_load_u64L | |||
|
85 | #define __load_u64M _elf_load_u64M | |||
|
86 | #define __load_i64L _elf_load_i64L | |||
|
87 | #define __load_i64M _elf_load_i64M | |||
|
88 | #define __store_u64L _elf_store_u64L | |||
|
89 | #define __store_u64M _elf_store_u64M | |||
|
90 | #define __store_i64L _elf_store_i64L | |||
|
91 | #define __store_i64M _elf_store_i64M | |||
|
92 | ||||
|
93 | #endif /* __LIBELF64 */ | |||
|
94 | ||||
|
95 | #endif /* _BYTESWAP_H */ |
This diff has been collapsed as it changes many lines, (1002 lines changed) Show them Hide them | |||||
@@ -0,0 +1,1002 | |||||
|
1 | /* | |||
|
2 | * elf_repl.h - public header file for systems that lack it. | |||
|
3 | * Copyright (C) 1995 - 2006 Michael Riepe | |||
|
4 | * | |||
|
5 | * This library is free software; you can redistribute it and/or | |||
|
6 | * modify it under the terms of the GNU Library General Public | |||
|
7 | * License as published by the Free Software Foundation; either | |||
|
8 | * version 2 of the License, or (at your option) any later version. | |||
|
9 | * | |||
|
10 | * This library is distributed in the hope that it will be useful, | |||
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | * Library General Public License for more details. | |||
|
14 | * | |||
|
15 | * You should have received a copy of the GNU Library General Public | |||
|
16 | * License along with this library; if not, write to the Free Software | |||
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | /* @(#) $Id: elf_repl.h,v 1.22 2009/11/01 13:04:19 michael Exp $ */ | |||
|
21 | ||||
|
22 | /* | |||
|
23 | * NEVER INCLUDE THIS FILE DIRECTLY - USE <libelf.h> INSTEAD! | |||
|
24 | */ | |||
|
25 | ||||
|
26 | #ifndef _ELF_REPL_H | |||
|
27 | #define _ELF_REPL_H | |||
|
28 | ||||
|
29 | #ifdef __cplusplus | |||
|
30 | extern "C" { | |||
|
31 | #endif /* __cplusplus */ | |||
|
32 | ||||
|
33 | /* | |||
|
34 | * Scalar data types | |||
|
35 | */ | |||
|
36 | typedef __libelf_u32_t Elf32_Addr; | |||
|
37 | typedef __libelf_u16_t Elf32_Half; | |||
|
38 | typedef __libelf_u32_t Elf32_Off; | |||
|
39 | typedef __libelf_i32_t Elf32_Sword; | |||
|
40 | typedef __libelf_u32_t Elf32_Word; | |||
|
41 | ||||
|
42 | #define ELF32_FSZ_ADDR 4 | |||
|
43 | #define ELF32_FSZ_HALF 2 | |||
|
44 | #define ELF32_FSZ_OFF 4 | |||
|
45 | #define ELF32_FSZ_SWORD 4 | |||
|
46 | #define ELF32_FSZ_WORD 4 | |||
|
47 | ||||
|
48 | #if __LIBELF64 | |||
|
49 | ||||
|
50 | typedef __libelf_u64_t Elf64_Addr; | |||
|
51 | typedef __libelf_u16_t Elf64_Half; | |||
|
52 | typedef __libelf_u64_t Elf64_Off; | |||
|
53 | typedef __libelf_i32_t Elf64_Sword; | |||
|
54 | typedef __libelf_u32_t Elf64_Word; | |||
|
55 | typedef __libelf_i64_t Elf64_Sxword; | |||
|
56 | typedef __libelf_u64_t Elf64_Xword; | |||
|
57 | ||||
|
58 | #define ELF64_FSZ_ADDR 8 | |||
|
59 | #define ELF64_FSZ_HALF 2 | |||
|
60 | #define ELF64_FSZ_OFF 8 | |||
|
61 | #define ELF64_FSZ_SWORD 4 | |||
|
62 | #define ELF64_FSZ_WORD 4 | |||
|
63 | #define ELF64_FSZ_SXWORD 8 | |||
|
64 | #define ELF64_FSZ_XWORD 8 | |||
|
65 | ||||
|
66 | /* | |||
|
67 | * Blame Sun for this... | |||
|
68 | */ | |||
|
69 | typedef __libelf_u64_t Elf64_Lword; | |||
|
70 | typedef __libelf_u64_t Elf32_Lword; | |||
|
71 | ||||
|
72 | #endif /* __LIBELF64 */ | |||
|
73 | ||||
|
74 | /* | |||
|
75 | * ELF header | |||
|
76 | */ | |||
|
77 | #define EI_NIDENT 16 | |||
|
78 | ||||
|
79 | typedef struct { | |||
|
80 | unsigned char e_ident[EI_NIDENT]; | |||
|
81 | Elf32_Half e_type; | |||
|
82 | Elf32_Half e_machine; | |||
|
83 | Elf32_Word e_version; | |||
|
84 | Elf32_Addr e_entry; | |||
|
85 | Elf32_Off e_phoff; | |||
|
86 | Elf32_Off e_shoff; | |||
|
87 | Elf32_Word e_flags; | |||
|
88 | Elf32_Half e_ehsize; | |||
|
89 | Elf32_Half e_phentsize; | |||
|
90 | Elf32_Half e_phnum; | |||
|
91 | Elf32_Half e_shentsize; | |||
|
92 | Elf32_Half e_shnum; | |||
|
93 | Elf32_Half e_shstrndx; | |||
|
94 | } Elf32_Ehdr; | |||
|
95 | ||||
|
96 | #if __LIBELF64 | |||
|
97 | typedef struct { | |||
|
98 | unsigned char e_ident[EI_NIDENT]; | |||
|
99 | Elf64_Half e_type; | |||
|
100 | Elf64_Half e_machine; | |||
|
101 | Elf64_Word e_version; | |||
|
102 | Elf64_Addr e_entry; | |||
|
103 | Elf64_Off e_phoff; | |||
|
104 | Elf64_Off e_shoff; | |||
|
105 | Elf64_Word e_flags; | |||
|
106 | Elf64_Half e_ehsize; | |||
|
107 | Elf64_Half e_phentsize; | |||
|
108 | Elf64_Half e_phnum; | |||
|
109 | Elf64_Half e_shentsize; | |||
|
110 | Elf64_Half e_shnum; | |||
|
111 | Elf64_Half e_shstrndx; | |||
|
112 | } Elf64_Ehdr; | |||
|
113 | #endif /* __LIBELF64 */ | |||
|
114 | ||||
|
115 | /* | |||
|
116 | * e_ident | |||
|
117 | */ | |||
|
118 | #define EI_MAG0 0 | |||
|
119 | #define EI_MAG1 1 | |||
|
120 | #define EI_MAG2 2 | |||
|
121 | #define EI_MAG3 3 | |||
|
122 | #define EI_CLASS 4 | |||
|
123 | #define EI_DATA 5 | |||
|
124 | #define EI_VERSION 6 | |||
|
125 | #define EI_OSABI 7 | |||
|
126 | #define EI_ABIVERSION 8 | |||
|
127 | #define EI_PAD 9 | |||
|
128 | ||||
|
129 | #define ELFMAG0 0x7f | |||
|
130 | #define ELFMAG1 'E' | |||
|
131 | #define ELFMAG2 'L' | |||
|
132 | #define ELFMAG3 'F' | |||
|
133 | #define ELFMAG "\177ELF" | |||
|
134 | #define SELFMAG 4 | |||
|
135 | ||||
|
136 | /* | |||
|
137 | * e_ident[EI_CLASS] | |||
|
138 | */ | |||
|
139 | #define ELFCLASSNONE 0 | |||
|
140 | #define ELFCLASS32 1 | |||
|
141 | #define ELFCLASS64 2 | |||
|
142 | #define ELFCLASSNUM 3 | |||
|
143 | ||||
|
144 | /* | |||
|
145 | * e_ident[EI_DATA] | |||
|
146 | */ | |||
|
147 | #define ELFDATANONE 0 | |||
|
148 | #define ELFDATA2LSB 1 | |||
|
149 | #define ELFDATA2MSB 2 | |||
|
150 | #define ELFDATANUM 3 | |||
|
151 | ||||
|
152 | /* | |||
|
153 | * e_ident[EI_OSABI] | |||
|
154 | */ | |||
|
155 | #define ELFOSABI_NONE 0 /* No extensions or unspecified */ | |||
|
156 | #define ELFOSABI_SYSV ELFOSABI_NONE | |||
|
157 | #define ELFOSABI_HPUX 1 /* Hewlett-Packard HP-UX */ | |||
|
158 | #define ELFOSABI_NETBSD 2 /* NetBSD */ | |||
|
159 | #define ELFOSABI_LINUX 3 /* Linux */ | |||
|
160 | #define ELFOSABI_SOLARIS 6 /* Sun Solaris */ | |||
|
161 | #define ELFOSABI_AIX 7 /* AIX */ | |||
|
162 | #define ELFOSABI_IRIX 8 /* IRIX */ | |||
|
163 | #define ELFOSABI_FREEBSD 9 /* FreeBSD */ | |||
|
164 | #define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX */ | |||
|
165 | #define ELFOSABI_MODESTO 11 /* Novell Modesto */ | |||
|
166 | #define ELFOSABI_OPENBSD 12 /* Open BSD */ | |||
|
167 | #define ELFOSABI_OPENVMS 13 /* Open VMS */ | |||
|
168 | #define ELFOSABI_NSK 14 /* Hewlett-Packard Non-Stop Kernel */ | |||
|
169 | #define ELFOSABI_AROS 15 /* Amiga Research OS */ | |||
|
170 | /* these are probably obsolete: */ | |||
|
171 | #define ELFOSABI_ARM_AEABI 64 /* ARM EABI */ | |||
|
172 | #define ELFOSABI_ARM 97 /* ARM */ | |||
|
173 | #define ELFOSABI_STANDALONE 255 /* standalone (embedded) application */ | |||
|
174 | ||||
|
175 | ||||
|
176 | /* | |||
|
177 | * e_type | |||
|
178 | */ | |||
|
179 | #define ET_NONE 0 | |||
|
180 | #define ET_REL 1 | |||
|
181 | #define ET_EXEC 2 | |||
|
182 | #define ET_DYN 3 | |||
|
183 | #define ET_CORE 4 | |||
|
184 | #define ET_NUM 5 | |||
|
185 | #define ET_LOOS 0xfe00 | |||
|
186 | #define ET_HIOS 0xfeff | |||
|
187 | #define ET_LOPROC 0xff00 | |||
|
188 | #define ET_HIPROC 0xffff | |||
|
189 | ||||
|
190 | /* | |||
|
191 | * e_machine | |||
|
192 | */ | |||
|
193 | #define EM_NONE 0 /* No machine */ | |||
|
194 | #define EM_M32 1 /* AT&T WE 32100 */ | |||
|
195 | #define EM_SPARC 2 /* SPARC */ | |||
|
196 | #define EM_386 3 /* Intel 80386 */ | |||
|
197 | #define EM_68K 4 /* Motorola 68000 */ | |||
|
198 | #define EM_88K 5 /* Motorola 88000 */ | |||
|
199 | #define EM_486 6 /* Intel i486 (DO NOT USE THIS ONE) */ | |||
|
200 | #define EM_860 7 /* Intel 80860 */ | |||
|
201 | #define EM_MIPS 8 /* MIPS I Architecture */ | |||
|
202 | #define EM_S370 9 /* IBM System/370 Processor */ | |||
|
203 | #define EM_MIPS_RS3_LE 10 /* MIPS RS3000 Little-endian */ | |||
|
204 | #define EM_SPARC64 11 /* SPARC 64-bit */ | |||
|
205 | #define EM_PARISC 15 /* Hewlett-Packard PA-RISC */ | |||
|
206 | #define EM_VPP500 17 /* Fujitsu VPP500 */ | |||
|
207 | #define EM_SPARC32PLUS 18 /* Enhanced instruction set SPARC */ | |||
|
208 | #define EM_960 19 /* Intel 80960 */ | |||
|
209 | #define EM_PPC 20 /* PowerPC */ | |||
|
210 | #define EM_PPC64 21 /* 64-bit PowerPC */ | |||
|
211 | #define EM_S390 22 /* IBM System/390 Processor */ | |||
|
212 | #define EM_V800 36 /* NEC V800 */ | |||
|
213 | #define EM_FR20 37 /* Fujitsu FR20 */ | |||
|
214 | #define EM_RH32 38 /* TRW RH-32 */ | |||
|
215 | #define EM_RCE 39 /* Motorola RCE */ | |||
|
216 | #define EM_ARM 40 /* Advanced RISC Machines ARM */ | |||
|
217 | #define EM_FAKE_ALPHA 41 /* Digital Alpha */ | |||
|
218 | #define EM_SH 42 /* Hitachi SH */ | |||
|
219 | #define EM_SPARCV9 43 /* SPARC Version 9 */ | |||
|
220 | #define EM_TRICORE 44 /* Siemens TriCore embedded processor */ | |||
|
221 | #define EM_ARC 45 /* Argonaut RISC Core, Argonaut Technologies Inc. */ | |||
|
222 | #define EM_H8_300 46 /* Hitachi H8/300 */ | |||
|
223 | #define EM_H8_300H 47 /* Hitachi H8/300H */ | |||
|
224 | #define EM_H8S 48 /* Hitachi H8S */ | |||
|
225 | #define EM_H8_500 49 /* Hitachi H8/500 */ | |||
|
226 | #define EM_IA_64 50 /* Intel IA-64 processor architecture */ | |||
|
227 | #define EM_MIPS_X 51 /* Stanford MIPS-X */ | |||
|
228 | #define EM_COLDFIRE 52 /* Motorola ColdFire */ | |||
|
229 | #define EM_68HC12 53 /* Motorola M68HC12 */ | |||
|
230 | #define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator */ | |||
|
231 | #define EM_PCP 55 /* Siemens PCP */ | |||
|
232 | #define EM_NCPU 56 /* Sony nCPU embedded RISC processor */ | |||
|
233 | #define EM_NDR1 57 /* Denso NDR1 microprocessor */ | |||
|
234 | #define EM_STARCORE 58 /* Motorola Star*Core processor */ | |||
|
235 | #define EM_ME16 59 /* Toyota ME16 processor */ | |||
|
236 | #define EM_ST100 60 /* STMicroelectronics ST100 processor */ | |||
|
237 | #define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ embedded processor family */ | |||
|
238 | #define EM_X86_64 62 /* AMD x86-64 architecture */ | |||
|
239 | #define EM_AMD64 EM_X86_64 | |||
|
240 | #define EM_PDSP 63 /* Sony DSP Processor */ | |||
|
241 | #define EM_FX66 66 /* Siemens FX66 microcontroller */ | |||
|
242 | #define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 bit microcontroller */ | |||
|
243 | #define EM_ST7 68 /* STMicroelectronics ST7 8-bit microcontroller */ | |||
|
244 | #define EM_68HC16 69 /* Motorola MC68HC16 Microcontroller */ | |||
|
245 | #define EM_68HC11 70 /* Motorola MC68HC11 Microcontroller */ | |||
|
246 | #define EM_68HC08 71 /* Motorola MC68HC08 Microcontroller */ | |||
|
247 | #define EM_68HC05 72 /* Motorola MC68HC05 Microcontroller */ | |||
|
248 | #define EM_SVX 73 /* Silicon Graphics SVx */ | |||
|
249 | #define EM_ST19 74 /* STMicroelectronics ST19 8-bit microcontroller */ | |||
|
250 | #define EM_VAX 75 /* Digital VAX */ | |||
|
251 | #define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ | |||
|
252 | #define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */ | |||
|
253 | #define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ | |||
|
254 | #define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ | |||
|
255 | #define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ | |||
|
256 | #define EM_HUANY 81 /* Harvard University machine-independent object files */ | |||
|
257 | #define EM_PRISM 82 /* SiTera Prism */ | |||
|
258 | #define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ | |||
|
259 | #define EM_FR30 84 /* Fujitsu FR30 */ | |||
|
260 | #define EM_D10V 85 /* Mitsubishi D10V */ | |||
|
261 | #define EM_D30V 86 /* Mitsubishi D30V */ | |||
|
262 | #define EM_V850 87 /* NEC v850 */ | |||
|
263 | #define EM_M32R 88 /* Mitsubishi M32R */ | |||
|
264 | #define EM_MN10300 89 /* Matsushita MN10300 */ | |||
|
265 | #define EM_MN10200 90 /* Matsushita MN10200 */ | |||
|
266 | #define EM_PJ 91 /* picoJava */ | |||
|
267 | #define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ | |||
|
268 | #define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ | |||
|
269 | #define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ | |||
|
270 | #define EM_VIDEOCORE 95 /* Alphamosaic VideoCore processor */ | |||
|
271 | #define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Processor */ | |||
|
272 | #define EM_NS32K 97 /* National Semiconductor 32000 series */ | |||
|
273 | #define EM_TPC 98 /* Tenor Network TPC processor */ | |||
|
274 | #define EM_SNP1K 99 /* Trebia SNP 1000 processor */ | |||
|
275 | #define EM_ST200 100 /* STMicroelectronics (www.st.com) ST200 microcontroller */ | |||
|
276 | #define EM_IP2K 101 /* Ubicom IP2xxx microcontroller family */ | |||
|
277 | #define EM_MAX 102 /* MAX Processor */ | |||
|
278 | #define EM_CR 103 /* National Semiconductor CompactRISC microprocessor */ | |||
|
279 | #define EM_F2MC16 104 /* Fujitsu F2MC16 */ | |||
|
280 | #define EM_MSP430 105 /* Texas Instruments embedded microcontroller msp430 */ | |||
|
281 | #define EM_BLACKFIN 106 /* Analog Devices Blackfin (DSP) processor */ | |||
|
282 | #define EM_SE_C33 107 /* S1C33 Family of Seiko Epson processors */ | |||
|
283 | #define EM_SEP 108 /* Sharp embedded microprocessor */ | |||
|
284 | #define EM_ARCA 109 /* Arca RISC Microprocessor */ | |||
|
285 | #define EM_UNICORE 110 /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */ | |||
|
286 | #define EM_AARCH64 183 /* ARM AARCH64 */ | |||
|
287 | #define EM_TILEPRO 188 /* Tilera TILEPro */ | |||
|
288 | #define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */ | |||
|
289 | #define EM_TILEGX 191 /* Tilera TILE-Gx */ | |||
|
290 | #define EM_NUM 192 | |||
|
291 | ||||
|
292 | ||||
|
293 | /* | |||
|
294 | * e_ident[EI_VERSION], e_version | |||
|
295 | */ | |||
|
296 | #define EV_NONE 0 | |||
|
297 | #define EV_CURRENT 1 | |||
|
298 | #define EV_NUM 2 | |||
|
299 | ||||
|
300 | /* | |||
|
301 | * Section header | |||
|
302 | */ | |||
|
303 | typedef struct { | |||
|
304 | Elf32_Word sh_name; | |||
|
305 | Elf32_Word sh_type; | |||
|
306 | Elf32_Word sh_flags; | |||
|
307 | Elf32_Addr sh_addr; | |||
|
308 | Elf32_Off sh_offset; | |||
|
309 | Elf32_Word sh_size; | |||
|
310 | Elf32_Word sh_link; | |||
|
311 | Elf32_Word sh_info; | |||
|
312 | Elf32_Word sh_addralign; | |||
|
313 | Elf32_Word sh_entsize; | |||
|
314 | } Elf32_Shdr; | |||
|
315 | ||||
|
316 | #if __LIBELF64 | |||
|
317 | typedef struct { | |||
|
318 | Elf64_Word sh_name; | |||
|
319 | Elf64_Word sh_type; | |||
|
320 | Elf64_Xword sh_flags; | |||
|
321 | Elf64_Addr sh_addr; | |||
|
322 | Elf64_Off sh_offset; | |||
|
323 | Elf64_Xword sh_size; | |||
|
324 | Elf64_Word sh_link; | |||
|
325 | Elf64_Word sh_info; | |||
|
326 | Elf64_Xword sh_addralign; | |||
|
327 | Elf64_Xword sh_entsize; | |||
|
328 | } Elf64_Shdr; | |||
|
329 | #endif /* __LIBELF64 */ | |||
|
330 | ||||
|
331 | /* | |||
|
332 | * Special section indices | |||
|
333 | */ | |||
|
334 | #define SHN_UNDEF 0 | |||
|
335 | #define SHN_LORESERVE 0xff00 | |||
|
336 | #define SHN_LOPROC 0xff00 | |||
|
337 | #define SHN_HIPROC 0xff1f | |||
|
338 | #define SHN_LOOS 0xff20 | |||
|
339 | #define SHN_HIOS 0xff3f | |||
|
340 | #define SHN_ABS 0xfff1 | |||
|
341 | #define SHN_COMMON 0xfff2 | |||
|
342 | #define SHN_XINDEX 0xffff | |||
|
343 | #define SHN_HIRESERVE 0xffff | |||
|
344 | ||||
|
345 | /* | |||
|
346 | * sh_type | |||
|
347 | */ | |||
|
348 | #define SHT_NULL 0 | |||
|
349 | #define SHT_PROGBITS 1 | |||
|
350 | #define SHT_SYMTAB 2 | |||
|
351 | #define SHT_STRTAB 3 | |||
|
352 | #define SHT_RELA 4 | |||
|
353 | #define SHT_HASH 5 | |||
|
354 | #define SHT_DYNAMIC 6 | |||
|
355 | #define SHT_NOTE 7 | |||
|
356 | #define SHT_NOBITS 8 | |||
|
357 | #define SHT_REL 9 | |||
|
358 | #define SHT_SHLIB 10 | |||
|
359 | #define SHT_DYNSYM 11 | |||
|
360 | #define SHT_INIT_ARRAY 14 | |||
|
361 | #define SHT_FINI_ARRAY 15 | |||
|
362 | #define SHT_PREINIT_ARRAY 16 | |||
|
363 | #define SHT_GROUP 17 | |||
|
364 | #define SHT_SYMTAB_SHNDX 18 | |||
|
365 | #define SHT_NUM 19 | |||
|
366 | #define SHT_LOOS 0x60000000 | |||
|
367 | #define SHT_HIOS 0x6fffffff | |||
|
368 | #define SHT_LOPROC 0x70000000 | |||
|
369 | #define SHT_HIPROC 0x7fffffff | |||
|
370 | #define SHT_LOUSER 0x80000000 | |||
|
371 | #define SHT_HIUSER 0xffffffff | |||
|
372 | ||||
|
373 | /* | |||
|
374 | * Solaris extensions | |||
|
375 | */ | |||
|
376 | #define SHT_LOSUNW 0x6ffffff4 | |||
|
377 | #define SHT_SUNW_dof 0x6ffffff4 | |||
|
378 | #define SHT_SUNW_cap 0x6ffffff5 | |||
|
379 | #define SHT_SUNW_SIGNATURE 0x6ffffff6 | |||
|
380 | #define SHT_SUNW_ANNOTATE 0x6ffffff7 | |||
|
381 | #define SHT_SUNW_DEBUGSTR 0x6ffffff8 | |||
|
382 | #define SHT_SUNW_DEBUG 0x6ffffff9 | |||
|
383 | #define SHT_SUNW_move 0x6ffffffa | |||
|
384 | #define SHT_SUNW_COMDAT 0x6ffffffb | |||
|
385 | #define SHT_SUNW_syminfo 0x6ffffffc | |||
|
386 | #define SHT_SUNW_verdef 0x6ffffffd | |||
|
387 | #define SHT_SUNW_verneed 0x6ffffffe | |||
|
388 | #define SHT_SUNW_versym 0x6fffffff | |||
|
389 | #define SHT_HISUNW 0x6fffffff | |||
|
390 | ||||
|
391 | #define SHT_SPARC_GOTDATA 0x70000000 | |||
|
392 | #define SHT_AMD64_UNWIND 0x70000001 | |||
|
393 | ||||
|
394 | /* | |||
|
395 | * GNU extensions | |||
|
396 | */ | |||
|
397 | #define SHT_GNU_verdef 0x6ffffffd | |||
|
398 | #define SHT_GNU_verneed 0x6ffffffe | |||
|
399 | #define SHT_GNU_versym 0x6fffffff | |||
|
400 | ||||
|
401 | /* | |||
|
402 | * sh_flags | |||
|
403 | */ | |||
|
404 | #define SHF_WRITE 0x1 | |||
|
405 | #define SHF_ALLOC 0x2 | |||
|
406 | #define SHF_EXECINSTR 0x4 | |||
|
407 | #define SHF_MERGE 0x10 | |||
|
408 | #define SHF_STRINGS 0x20 | |||
|
409 | #define SHF_INFO_LINK 0x40 | |||
|
410 | #define SHF_LINK_ORDER 0x80 | |||
|
411 | #define SHF_OS_NONCONFORMING 0x100 | |||
|
412 | #define SHF_GROUP 0x200 | |||
|
413 | #define SHF_TLS 0x400 | |||
|
414 | #define SHF_MASKOS 0x0ff00000 | |||
|
415 | #define SHF_MASKPROC 0xf0000000 | |||
|
416 | ||||
|
417 | /* | |||
|
418 | * Solaris extensions | |||
|
419 | */ | |||
|
420 | #define SHF_AMD64_LARGE 0x10000000 | |||
|
421 | #define SHF_ORDERED 0x40000000 | |||
|
422 | #define SHF_EXCLUDE 0x80000000 | |||
|
423 | ||||
|
424 | /* | |||
|
425 | * Section group flags | |||
|
426 | */ | |||
|
427 | #define GRP_COMDAT 0x1 | |||
|
428 | #define GRP_MASKOS 0x0ff00000 | |||
|
429 | #define GRP_MASKPROC 0xf0000000 | |||
|
430 | ||||
|
431 | /* | |||
|
432 | * Symbol table | |||
|
433 | */ | |||
|
434 | typedef struct { | |||
|
435 | Elf32_Word st_name; | |||
|
436 | Elf32_Addr st_value; | |||
|
437 | Elf32_Word st_size; | |||
|
438 | unsigned char st_info; | |||
|
439 | unsigned char st_other; | |||
|
440 | Elf32_Half st_shndx; | |||
|
441 | } Elf32_Sym; | |||
|
442 | ||||
|
443 | #if __LIBELF64 | |||
|
444 | typedef struct { | |||
|
445 | Elf64_Word st_name; | |||
|
446 | unsigned char st_info; | |||
|
447 | unsigned char st_other; | |||
|
448 | Elf64_Half st_shndx; | |||
|
449 | Elf64_Addr st_value; | |||
|
450 | Elf64_Xword st_size; | |||
|
451 | } Elf64_Sym; | |||
|
452 | #endif /* __LIBELF64 */ | |||
|
453 | ||||
|
454 | /* | |||
|
455 | * Special symbol indices | |||
|
456 | */ | |||
|
457 | #define STN_UNDEF 0 | |||
|
458 | ||||
|
459 | /* | |||
|
460 | * Macros for manipulating st_info | |||
|
461 | */ | |||
|
462 | #define ELF32_ST_BIND(i) ((i)>>4) | |||
|
463 | #define ELF32_ST_TYPE(i) ((i)&0xf) | |||
|
464 | #define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) | |||
|
465 | ||||
|
466 | #if __LIBELF64 | |||
|
467 | #define ELF64_ST_BIND(i) ((i)>>4) | |||
|
468 | #define ELF64_ST_TYPE(i) ((i)&0xf) | |||
|
469 | #define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) | |||
|
470 | #endif /* __LIBELF64 */ | |||
|
471 | ||||
|
472 | /* | |||
|
473 | * Symbol binding | |||
|
474 | */ | |||
|
475 | #define STB_LOCAL 0 | |||
|
476 | #define STB_GLOBAL 1 | |||
|
477 | #define STB_WEAK 2 | |||
|
478 | #define STB_NUM 3 | |||
|
479 | #define STB_LOOS 10 | |||
|
480 | #define STB_HIOS 12 | |||
|
481 | #define STB_LOPROC 13 | |||
|
482 | #define STB_HIPROC 15 | |||
|
483 | ||||
|
484 | /* | |||
|
485 | * Symbol types | |||
|
486 | */ | |||
|
487 | #define STT_NOTYPE 0 | |||
|
488 | #define STT_OBJECT 1 | |||
|
489 | #define STT_FUNC 2 | |||
|
490 | #define STT_SECTION 3 | |||
|
491 | #define STT_FILE 4 | |||
|
492 | #define STT_COMMON 5 | |||
|
493 | #define STT_TLS 6 | |||
|
494 | #define STT_NUM 7 | |||
|
495 | #define STT_LOOS 10 | |||
|
496 | #define STT_HIOS 12 | |||
|
497 | #define STT_LOPROC 13 | |||
|
498 | #define STT_HIPROC 15 | |||
|
499 | ||||
|
500 | /* | |||
|
501 | * Macros for manipulating st_other | |||
|
502 | */ | |||
|
503 | #define ELF32_ST_VISIBILITY(o) ((o)&0x3) | |||
|
504 | #if __LIBELF64 | |||
|
505 | #define ELF64_ST_VISIBILITY(o) ((o)&0x3) | |||
|
506 | #endif /* __LIBELF64 */ | |||
|
507 | ||||
|
508 | /* | |||
|
509 | * Symbol visibility | |||
|
510 | */ | |||
|
511 | #define STV_DEFAULT 0 | |||
|
512 | #define STV_INTERNAL 1 | |||
|
513 | #define STV_HIDDEN 2 | |||
|
514 | #define STV_PROTECTED 3 | |||
|
515 | ||||
|
516 | /* | |||
|
517 | * Relocation | |||
|
518 | */ | |||
|
519 | typedef struct { | |||
|
520 | Elf32_Addr r_offset; | |||
|
521 | Elf32_Word r_info; | |||
|
522 | } Elf32_Rel; | |||
|
523 | ||||
|
524 | typedef struct { | |||
|
525 | Elf32_Addr r_offset; | |||
|
526 | Elf32_Word r_info; | |||
|
527 | Elf32_Sword r_addend; | |||
|
528 | } Elf32_Rela; | |||
|
529 | ||||
|
530 | #if __LIBELF64 | |||
|
531 | typedef struct { | |||
|
532 | Elf64_Addr r_offset; | |||
|
533 | Elf64_Xword r_info; | |||
|
534 | } Elf64_Rel; | |||
|
535 | ||||
|
536 | typedef struct { | |||
|
537 | Elf64_Addr r_offset; | |||
|
538 | Elf64_Xword r_info; | |||
|
539 | Elf64_Sxword r_addend; | |||
|
540 | } Elf64_Rela; | |||
|
541 | #endif /* __LIBELF64 */ | |||
|
542 | ||||
|
543 | /* | |||
|
544 | * Macros for manipulating r_info | |||
|
545 | */ | |||
|
546 | #define ELF32_R_SYM(i) ((i)>>8) | |||
|
547 | #define ELF32_R_TYPE(i) ((unsigned char)(i)) | |||
|
548 | #define ELF32_R_INFO(s,t) (((s)<<8)+(unsigned char)(t)) | |||
|
549 | ||||
|
550 | #if __LIBELF64 | |||
|
551 | #define ELF64_R_SYM(i) ((Elf64_Xword)(i)>>32) | |||
|
552 | #define ELF64_R_TYPE(i) ((i)&0xffffffffL) | |||
|
553 | #define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL)) | |||
|
554 | #endif /* __LIBELF64 */ | |||
|
555 | ||||
|
556 | /* | |||
|
557 | * Note entry header | |||
|
558 | */ | |||
|
559 | typedef struct { | |||
|
560 | Elf32_Word n_namesz; /* name size */ | |||
|
561 | Elf32_Word n_descsz; /* descriptor size */ | |||
|
562 | Elf32_Word n_type; /* descriptor type */ | |||
|
563 | } Elf32_Nhdr; | |||
|
564 | ||||
|
565 | #if __LIBELF64 | |||
|
566 | /* Solaris and GNU use this layout. Be compatible. */ | |||
|
567 | /* XXX: Latest ELF specs say it's 64-bit!!! */ | |||
|
568 | typedef struct { | |||
|
569 | Elf64_Word n_namesz; /* name size */ | |||
|
570 | Elf64_Word n_descsz; /* descriptor size */ | |||
|
571 | Elf64_Word n_type; /* descriptor type */ | |||
|
572 | } Elf64_Nhdr; | |||
|
573 | #endif /* __LIBELF64 */ | |||
|
574 | ||||
|
575 | /* | |||
|
576 | * Well-known descriptor types for ET_CORE files | |||
|
577 | */ | |||
|
578 | #define NT_PRSTATUS 1 | |||
|
579 | #define NT_PRFPREG 2 | |||
|
580 | #define NT_PRPSINFO 3 | |||
|
581 | ||||
|
582 | /* | |||
|
583 | * Program header | |||
|
584 | */ | |||
|
585 | typedef struct { | |||
|
586 | Elf32_Word p_type; | |||
|
587 | Elf32_Off p_offset; | |||
|
588 | Elf32_Addr p_vaddr; | |||
|
589 | Elf32_Addr p_paddr; | |||
|
590 | Elf32_Word p_filesz; | |||
|
591 | Elf32_Word p_memsz; | |||
|
592 | Elf32_Word p_flags; | |||
|
593 | Elf32_Word p_align; | |||
|
594 | } Elf32_Phdr; | |||
|
595 | ||||
|
596 | #if __LIBELF64 | |||
|
597 | typedef struct { | |||
|
598 | Elf64_Word p_type; | |||
|
599 | Elf64_Word p_flags; | |||
|
600 | Elf64_Off p_offset; | |||
|
601 | Elf64_Addr p_vaddr; | |||
|
602 | Elf64_Addr p_paddr; | |||
|
603 | Elf64_Xword p_filesz; | |||
|
604 | Elf64_Xword p_memsz; | |||
|
605 | Elf64_Xword p_align; | |||
|
606 | } Elf64_Phdr; | |||
|
607 | #endif /* __LIBELF64 */ | |||
|
608 | ||||
|
609 | /* | |||
|
610 | * Special numbers | |||
|
611 | */ | |||
|
612 | #define PN_XNUM 0xffff | |||
|
613 | ||||
|
614 | /* | |||
|
615 | * p_type | |||
|
616 | */ | |||
|
617 | #define PT_NULL 0 | |||
|
618 | #define PT_LOAD 1 | |||
|
619 | #define PT_DYNAMIC 2 | |||
|
620 | #define PT_INTERP 3 | |||
|
621 | #define PT_NOTE 4 | |||
|
622 | #define PT_SHLIB 5 | |||
|
623 | #define PT_PHDR 6 | |||
|
624 | #define PT_TLS 7 | |||
|
625 | #define PT_NUM 8 | |||
|
626 | #define PT_LOOS 0x60000000 | |||
|
627 | #define PT_HIOS 0x6fffffff | |||
|
628 | #define PT_LOPROC 0x70000000 | |||
|
629 | #define PT_HIPROC 0x7fffffff | |||
|
630 | ||||
|
631 | /* | |||
|
632 | * Solaris extensions | |||
|
633 | */ | |||
|
634 | ||||
|
635 | #define PT_SUNW_UNWIND 0x6464e550 | |||
|
636 | #define PT_LOSUNW 0x6ffffffa | |||
|
637 | #define PT_SUNWBSS 0x6ffffffa | |||
|
638 | #define PT_SUNWSTACK 0x6ffffffb | |||
|
639 | #define PT_SUNWDTRACE 0x6ffffffc | |||
|
640 | #define PT_SUNWCAP 0x6ffffffd | |||
|
641 | #define PT_HISUNW 0x6fffffff | |||
|
642 | ||||
|
643 | /* | |||
|
644 | * p_flags | |||
|
645 | */ | |||
|
646 | #define PF_X 0x1 | |||
|
647 | #define PF_W 0x2 | |||
|
648 | #define PF_R 0x4 | |||
|
649 | #define PF_MASKOS 0x0ff00000 | |||
|
650 | #define PF_MASKPROC 0xf0000000 | |||
|
651 | ||||
|
652 | /* | |||
|
653 | * Dynamic structure | |||
|
654 | */ | |||
|
655 | typedef struct { | |||
|
656 | Elf32_Sword d_tag; | |||
|
657 | union { | |||
|
658 | Elf32_Word d_val; | |||
|
659 | Elf32_Addr d_ptr; | |||
|
660 | } d_un; | |||
|
661 | } Elf32_Dyn; | |||
|
662 | ||||
|
663 | #if __LIBELF64 | |||
|
664 | typedef struct { | |||
|
665 | Elf64_Sxword d_tag; | |||
|
666 | union { | |||
|
667 | Elf64_Xword d_val; | |||
|
668 | Elf64_Addr d_ptr; | |||
|
669 | } d_un; | |||
|
670 | } Elf64_Dyn; | |||
|
671 | #endif /* __LIBELF64 */ | |||
|
672 | ||||
|
673 | /* | |||
|
674 | * Dynamic array tags | |||
|
675 | */ | |||
|
676 | /* d_un exec shared */ | |||
|
677 | #define DT_NULL 0 /* ign. mand. mand. */ | |||
|
678 | #define DT_NEEDED 1 /* d_val opt. opt. */ | |||
|
679 | #define DT_PLTRELSZ 2 /* d_val opt. opt. */ | |||
|
680 | #define DT_PLTGOT 3 /* d_ptr opt. opt. */ | |||
|
681 | #define DT_HASH 4 /* d_ptr mand. mand. */ | |||
|
682 | #define DT_STRTAB 5 /* d_ptr mand. mand. */ | |||
|
683 | #define DT_SYMTAB 6 /* d_ptr mand. mand. */ | |||
|
684 | #define DT_RELA 7 /* d_ptr mand. opt. */ | |||
|
685 | #define DT_RELASZ 8 /* d_val mand. opt. */ | |||
|
686 | #define DT_RELAENT 9 /* d_val mand. opt. */ | |||
|
687 | #define DT_STRSZ 10 /* d_val mand. mand. */ | |||
|
688 | #define DT_SYMENT 11 /* d_val mand. mand. */ | |||
|
689 | #define DT_INIT 12 /* d_ptr opt. opt. */ | |||
|
690 | #define DT_FINI 13 /* d_ptr opt. opt. */ | |||
|
691 | #define DT_SONAME 14 /* d_val ign. opt. */ | |||
|
692 | #define DT_RPATH 15 /* d_val opt. ign. */ | |||
|
693 | #define DT_SYMBOLIC 16 /* ign. ign. opt. */ | |||
|
694 | #define DT_REL 17 /* d_ptr mand. opt. */ | |||
|
695 | #define DT_RELSZ 18 /* d_val mand. opt. */ | |||
|
696 | #define DT_RELENT 19 /* d_val mand. opt. */ | |||
|
697 | #define DT_PLTREL 20 /* d_val opt. opt. */ | |||
|
698 | #define DT_DEBUG 21 /* d_ptr opt. ign. */ | |||
|
699 | #define DT_TEXTREL 22 /* ign. opt. opt. */ | |||
|
700 | #define DT_JMPREL 23 /* d_ptr opt. opt. */ | |||
|
701 | #define DT_BIND_NOW 24 /* ign. opt. opt. */ | |||
|
702 | #define DT_INIT_ARRAY 25 /* d_ptr opt. opt. */ | |||
|
703 | #define DT_FINI_ARRAY 26 /* d_ptr opt. opt. */ | |||
|
704 | #define DT_INIT_ARRAYSZ 27 /* d_val opt. opt. */ | |||
|
705 | #define DT_FINI_ARRAYSZ 28 /* d_val opt. opt. */ | |||
|
706 | #define DT_RUNPATH 29 /* d_val opt. opt. */ | |||
|
707 | #define DT_FLAGS 30 /* d_val opt. opt. */ | |||
|
708 | #define DT_ENCODING 32 /* odd/even encoding rule starts here */ | |||
|
709 | #define DT_PREINIT_ARRAY 32 /* d_ptr opt. ign. */ | |||
|
710 | #define DT_PREINIT_ARRAYSZ 33 /* d_val opt. ign. */ | |||
|
711 | #define DT_NUM 34 | |||
|
712 | #define DT_LOOS 0x6000000D | |||
|
713 | #define DT_HIOS 0x6ffff000 | |||
|
714 | #define DT_LOPROC 0x70000000 | |||
|
715 | #define DT_HIPROC 0x7fffffff | |||
|
716 | ||||
|
717 | /* | |||
|
718 | * DT_FLAGS values | |||
|
719 | */ | |||
|
720 | #define DF_ORIGIN 0x1 | |||
|
721 | #define DF_SYMBOLIC 0x2 | |||
|
722 | #define DF_TEXTREL 0x4 | |||
|
723 | #define DF_BIND_NOW 0x8 | |||
|
724 | #define DF_STATIC_TLS 0x10 | |||
|
725 | ||||
|
726 | /* | |||
|
727 | * Solaris extensions | |||
|
728 | */ | |||
|
729 | #define DT_VALRNGLO 0x6ffffd00 | |||
|
730 | #define DT_CHECKSUM 0x6ffffdf8 | |||
|
731 | #define DT_PLTPADSZ 0x6ffffdf9 | |||
|
732 | #define DT_MOVEENT 0x6ffffdfa | |||
|
733 | #define DT_MOVESZ 0x6ffffdfb | |||
|
734 | #define DT_FEATURE_1 0x6ffffdfc | |||
|
735 | #define DT_POSFLAG_1 0x6ffffdfd | |||
|
736 | #define DT_SYMINSZ 0x6ffffdfe | |||
|
737 | #define DT_SYMINENT 0x6ffffdff | |||
|
738 | #define DT_VALRNGHI 0x6ffffdff | |||
|
739 | ||||
|
740 | #define DT_ADDRRNGLO 0x6ffffe00 | |||
|
741 | #define DT_CONFIG 0x6ffffefa | |||
|
742 | #define DT_DEPAUDIT 0x6ffffefb | |||
|
743 | #define DT_AUDIT 0x6ffffefc | |||
|
744 | #define DT_PLTPAD 0x6ffffefd | |||
|
745 | #define DT_MOVETAB 0x6ffffefe | |||
|
746 | #define DT_SYMINFO 0x6ffffeff | |||
|
747 | #define DT_ADDRRNGHI 0x6ffffeff | |||
|
748 | ||||
|
749 | #define DT_RELACOUNT 0x6ffffff9 | |||
|
750 | #define DT_RELCOUNT 0x6ffffffa | |||
|
751 | #define DT_FLAGS_1 0x6ffffffb | |||
|
752 | #define DT_VERDEF 0x6ffffffc | |||
|
753 | #define DT_VERDEFNUM 0x6ffffffd | |||
|
754 | #define DT_VERNEED 0x6ffffffe | |||
|
755 | #define DT_VERNEEDNUM 0x6fffffff | |||
|
756 | ||||
|
757 | #define DT_AUXILIARY 0x7ffffffd | |||
|
758 | #define DT_USED 0x7ffffffe | |||
|
759 | #define DT_FILTER 0x7fffffff | |||
|
760 | ||||
|
761 | /* | |||
|
762 | * GNU extensions | |||
|
763 | */ | |||
|
764 | #define DT_VERSYM 0x6ffffff0 | |||
|
765 | ||||
|
766 | /* | |||
|
767 | * DT_FEATURE_1 values | |||
|
768 | */ | |||
|
769 | #define DTF_1_PARINIT 0x1 | |||
|
770 | #define DTF_1_CONFEXP 0x2 | |||
|
771 | ||||
|
772 | /* | |||
|
773 | * DT_POSFLAG_1 values | |||
|
774 | */ | |||
|
775 | #define DF_P1_LAZYLOAD 0x1 | |||
|
776 | #define DF_P1_GROUPPERM 0x2 | |||
|
777 | ||||
|
778 | /* | |||
|
779 | * DT_FLAGS_1 values | |||
|
780 | */ | |||
|
781 | #define DF_1_NOW 0x00000001 | |||
|
782 | #define DF_1_GLOBAL 0x00000002 | |||
|
783 | #define DF_1_GROUP 0x00000004 | |||
|
784 | #define DF_1_NODELETE 0x00000008 | |||
|
785 | #define DF_1_LOADFLTR 0x00000010 | |||
|
786 | #define DF_1_INITFIRST 0x00000020 | |||
|
787 | #define DF_1_NOOPEN 0x00000040 | |||
|
788 | #define DF_1_ORIGIN 0x00000080 | |||
|
789 | #define DF_1_DIRECT 0x00000100 | |||
|
790 | #define DF_1_TRANS 0x00000200 | |||
|
791 | #define DF_1_INTERPOSE 0x00000400 | |||
|
792 | #define DF_1_NODEFLIB 0x00000800 | |||
|
793 | #define DF_1_NODUMP 0x00001000 | |||
|
794 | #define DF_1_CONFALT 0x00002000 | |||
|
795 | #define DF_1_ENDFILTEE 0x00004000 | |||
|
796 | #define DF_1_DISPRELDNE 0x00008000 | |||
|
797 | #define DF_1_DISPRELPND 0x00010000 | |||
|
798 | ||||
|
799 | /* | |||
|
800 | * Syminfo structure | |||
|
801 | */ | |||
|
802 | typedef struct { | |||
|
803 | Elf32_Half si_boundto; | |||
|
804 | Elf32_Half si_flags; | |||
|
805 | } Elf32_Syminfo; | |||
|
806 | ||||
|
807 | #if __LIBELF64 | |||
|
808 | typedef struct { | |||
|
809 | Elf64_Half si_boundto; | |||
|
810 | Elf64_Half si_flags; | |||
|
811 | } Elf64_Syminfo; | |||
|
812 | #endif /* __LIBELF64 */ | |||
|
813 | ||||
|
814 | /* | |||
|
815 | * Syminfo version (stored in unused first entry) | |||
|
816 | */ | |||
|
817 | #define SYMINFO_NONE 0 | |||
|
818 | #define SYMINFO_CURRENT 1 | |||
|
819 | #define SYMINFO_NUM 2 | |||
|
820 | ||||
|
821 | /* | |||
|
822 | * si_boundto special values | |||
|
823 | */ | |||
|
824 | #define SYMINFO_BT_LOWRESERVE 0xff00 | |||
|
825 | #define SYMINFO_BT_PARENT 0xfffe /* bound to parent */ | |||
|
826 | #define SYMINFO_BT_SELF 0xffff /* bound to self */ | |||
|
827 | ||||
|
828 | /* | |||
|
829 | * si_flags | |||
|
830 | */ | |||
|
831 | #define SYMINFO_FLG_DIRECT 0x01 /* bound to an object */ | |||
|
832 | #define SYMINFO_FLG_PASSTHRU 0x02 /* pass-thru symbol */ | |||
|
833 | #define SYMINFO_FLG_COPY 0x04 /* result of a copy relocation */ | |||
|
834 | #define SYMINFO_FLG_LAZYLOAD 0x08 /* bound to lazy-loaded object */ | |||
|
835 | ||||
|
836 | /* | |||
|
837 | * Version definitions | |||
|
838 | */ | |||
|
839 | typedef struct { | |||
|
840 | Elf32_Half vd_version; | |||
|
841 | Elf32_Half vd_flags; | |||
|
842 | Elf32_Half vd_ndx; | |||
|
843 | Elf32_Half vd_cnt; | |||
|
844 | Elf32_Word vd_hash; | |||
|
845 | Elf32_Word vd_aux; | |||
|
846 | Elf32_Word vd_next; | |||
|
847 | } Elf32_Verdef; | |||
|
848 | ||||
|
849 | typedef struct { | |||
|
850 | Elf32_Word vda_name; | |||
|
851 | Elf32_Word vda_next; | |||
|
852 | } Elf32_Verdaux; | |||
|
853 | ||||
|
854 | typedef struct { | |||
|
855 | Elf32_Half vn_version; | |||
|
856 | Elf32_Half vn_cnt; | |||
|
857 | Elf32_Word vn_file; | |||
|
858 | Elf32_Word vn_aux; | |||
|
859 | Elf32_Word vn_next; | |||
|
860 | } Elf32_Verneed; | |||
|
861 | ||||
|
862 | typedef struct { | |||
|
863 | Elf32_Word vna_hash; | |||
|
864 | Elf32_Half vna_flags; | |||
|
865 | Elf32_Half vna_other; | |||
|
866 | Elf32_Word vna_name; | |||
|
867 | Elf32_Word vna_next; | |||
|
868 | } Elf32_Vernaux; | |||
|
869 | ||||
|
870 | typedef Elf32_Half Elf32_Versym; | |||
|
871 | ||||
|
872 | #if __LIBELF64 | |||
|
873 | ||||
|
874 | typedef struct { | |||
|
875 | Elf64_Half vd_version; | |||
|
876 | Elf64_Half vd_flags; | |||
|
877 | Elf64_Half vd_ndx; | |||
|
878 | Elf64_Half vd_cnt; | |||
|
879 | Elf64_Word vd_hash; | |||
|
880 | Elf64_Word vd_aux; | |||
|
881 | Elf64_Word vd_next; | |||
|
882 | } Elf64_Verdef; | |||
|
883 | ||||
|
884 | typedef struct { | |||
|
885 | Elf64_Word vda_name; | |||
|
886 | Elf64_Word vda_next; | |||
|
887 | } Elf64_Verdaux; | |||
|
888 | ||||
|
889 | typedef struct { | |||
|
890 | Elf64_Half vn_version; | |||
|
891 | Elf64_Half vn_cnt; | |||
|
892 | Elf64_Word vn_file; | |||
|
893 | Elf64_Word vn_aux; | |||
|
894 | Elf64_Word vn_next; | |||
|
895 | } Elf64_Verneed; | |||
|
896 | ||||
|
897 | typedef struct { | |||
|
898 | Elf64_Word vna_hash; | |||
|
899 | Elf64_Half vna_flags; | |||
|
900 | Elf64_Half vna_other; | |||
|
901 | Elf64_Word vna_name; | |||
|
902 | Elf64_Word vna_next; | |||
|
903 | } Elf64_Vernaux; | |||
|
904 | ||||
|
905 | typedef Elf64_Half Elf64_Versym; | |||
|
906 | ||||
|
907 | #endif /* __LIBELF64 */ | |||
|
908 | ||||
|
909 | /* | |||
|
910 | * vd_version | |||
|
911 | */ | |||
|
912 | #define VER_DEF_NONE 0 | |||
|
913 | #define VER_DEF_CURRENT 1 | |||
|
914 | #define VER_DEF_NUM 2 | |||
|
915 | ||||
|
916 | /* | |||
|
917 | * vn_version | |||
|
918 | */ | |||
|
919 | #define VER_NEED_NONE 0 | |||
|
920 | #define VER_NEED_CURRENT 1 | |||
|
921 | #define VER_NEED_NUM 2 | |||
|
922 | ||||
|
923 | /* | |||
|
924 | * vd_flags / vna_flags | |||
|
925 | */ | |||
|
926 | #define VER_FLG_BASE 0x1 /* vd_flags only */ | |||
|
927 | #define VER_FLG_WEAK 0x2 | |||
|
928 | ||||
|
929 | /* | |||
|
930 | * Elf*_Versym special values | |||
|
931 | */ | |||
|
932 | #define VER_NDX_LOCAL 0 | |||
|
933 | #define VER_NDX_GLOBAL 1 | |||
|
934 | ||||
|
935 | /* | |||
|
936 | * Solaris extensions | |||
|
937 | */ | |||
|
938 | ||||
|
939 | /* | |||
|
940 | * Move section | |||
|
941 | */ | |||
|
942 | #if __LIBELF64 | |||
|
943 | ||||
|
944 | typedef struct { | |||
|
945 | Elf32_Lword m_value; | |||
|
946 | Elf32_Word m_info; | |||
|
947 | Elf32_Word m_poffset; | |||
|
948 | Elf32_Half m_repeat; | |||
|
949 | Elf32_Half m_stride; | |||
|
950 | } Elf32_Move; | |||
|
951 | ||||
|
952 | typedef struct { | |||
|
953 | Elf64_Lword m_value; | |||
|
954 | Elf64_Xword m_info; | |||
|
955 | Elf64_Xword m_poffset; | |||
|
956 | Elf64_Half m_repeat; | |||
|
957 | Elf64_Half m_stride; | |||
|
958 | } Elf64_Move; | |||
|
959 | ||||
|
960 | #define ELF32_M_SYM(info) ((info)>>8) | |||
|
961 | #define ELF32_M_SIZE(info) ((unsigned char)(info)) | |||
|
962 | #define ELF32_M_INFO(sym, sz) (((sym)<<8)+(unsigned char)(sz)) | |||
|
963 | ||||
|
964 | #define ELF64_M_SYM(info) ((Elf64_Xword)(info)>>8) | |||
|
965 | #define ELF64_M_SIZE(info) ((unsigned char)(info)) | |||
|
966 | #define ELF64_M_INFO(sym, sz) (((Elf64_Xword)(sym)<<8)+(unsigned char)(sz)) | |||
|
967 | ||||
|
968 | #endif /* __LIBELF64 */ | |||
|
969 | ||||
|
970 | /* | |||
|
971 | * Capabilities | |||
|
972 | */ | |||
|
973 | ||||
|
974 | typedef struct { | |||
|
975 | Elf32_Word c_tag; | |||
|
976 | union { | |||
|
977 | Elf32_Word c_val; | |||
|
978 | Elf32_Addr c_ptr; | |||
|
979 | } c_un; | |||
|
980 | } Elf32_Cap; | |||
|
981 | ||||
|
982 | #if __LIBELF64 | |||
|
983 | ||||
|
984 | typedef struct { | |||
|
985 | Elf64_Xword c_tag; | |||
|
986 | union { | |||
|
987 | Elf64_Xword c_val; | |||
|
988 | Elf64_Addr c_ptr; | |||
|
989 | } c_un; | |||
|
990 | } Elf64_Cap; | |||
|
991 | ||||
|
992 | #endif /* __LIBELF64 */ | |||
|
993 | ||||
|
994 | #define CA_SUNW_NULL 0 /* c_un ignored */ | |||
|
995 | #define CA_SUNW_HW_1 1 /* c_un.c_val */ | |||
|
996 | #define CA_SUNW_SF_1 2 /* c_un.c_val */ | |||
|
997 | ||||
|
998 | #ifdef __cplusplus | |||
|
999 | } | |||
|
1000 | #endif /* __cplusplus */ | |||
|
1001 | ||||
|
1002 | #endif /* _ELF_REPL_H */ |
@@ -0,0 +1,100 | |||||
|
1 | /* | |||
|
2 | * errors.h - exhaustive list of all error codes and messages for libelf. | |||
|
3 | * Copyright (C) 1995 - 2003, 2006 Michael Riepe | |||
|
4 | * | |||
|
5 | * This library is free software; you can redistribute it and/or | |||
|
6 | * modify it under the terms of the GNU Library General Public | |||
|
7 | * License as published by the Free Software Foundation; either | |||
|
8 | * version 2 of the License, or (at your option) any later version. | |||
|
9 | * | |||
|
10 | * This library is distributed in the hope that it will be useful, | |||
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | * Library General Public License for more details. | |||
|
14 | * | |||
|
15 | * You should have received a copy of the GNU Library General Public | |||
|
16 | * License along with this library; if not, write to the Free Software | |||
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | /* @(#) $Id: errors.h,v 1.18 2008/05/23 08:15:34 michael Exp $ */ | |||
|
21 | ||||
|
22 | /* dummy for xgettext */ | |||
|
23 | #define _(str) str | |||
|
24 | ||||
|
25 | __err__(ERROR_OK, _("no error")) | |||
|
26 | __err__(ERROR_UNKNOWN, _("unknown error")) | |||
|
27 | __err__(ERROR_INTERNAL, _("Internal error: unknown reason")) | |||
|
28 | __err__(ERROR_UNIMPLEMENTED, _("Internal error: not implemented")) | |||
|
29 | __err__(ERROR_WRONLY, _("Request error: cntl(ELF_C_FDREAD) on write-only file")) | |||
|
30 | __err__(ERROR_INVALID_CMD, _("Request error: invalid ELF_C_* argument")) | |||
|
31 | __err__(ERROR_FDDISABLED, _("Request error: file descriptor disabled")) | |||
|
32 | __err__(ERROR_NOTARCHIVE, _("Request error: not an archive")) | |||
|
33 | __err__(ERROR_BADOFF, _("Request error: offset out of range")) | |||
|
34 | __err__(ERROR_UNKNOWN_VERSION, _("Request error: unknown ELF version")) | |||
|
35 | __err__(ERROR_CMDMISMATCH, _("Request error: ELF_C_* argument does not match")) | |||
|
36 | __err__(ERROR_MEMBERWRITE, _("Request error: archive member begin() for writing")) | |||
|
37 | __err__(ERROR_FDMISMATCH, _("Request error: archive/member file descriptor mismatch")) | |||
|
38 | __err__(ERROR_NOTELF, _("Request error: not an ELF file")) | |||
|
39 | __err__(ERROR_CLASSMISMATCH, _("Request error: class file/memory mismatch")) | |||
|
40 | __err__(ERROR_UNKNOWN_TYPE, _("Request error: invalid ELF_T_* argument")) | |||
|
41 | __err__(ERROR_UNKNOWN_ENCODING, _("Request error: unknown data encoding")) | |||
|
42 | __err__(ERROR_DST2SMALL, _("Request error: destination buffer too small")) | |||
|
43 | __err__(ERROR_NULLBUF, _("Request error: d_buf is NULL")) | |||
|
44 | __err__(ERROR_UNKNOWN_CLASS, _("Request error: unknown ELF class")) | |||
|
45 | __err__(ERROR_ELFSCNMISMATCH, _("Request error: section does not belong to file")) | |||
|
46 | __err__(ERROR_NOSUCHSCN, _("Request error: no section at index")) | |||
|
47 | __err__(ERROR_NULLSCN, _("Request error: can't manipulate null section")) | |||
|
48 | __err__(ERROR_SCNDATAMISMATCH, _("Request error: data does not belong to section")) | |||
|
49 | __err__(ERROR_NOSTRTAB, _("Request error: no string table")) | |||
|
50 | __err__(ERROR_BADSTROFF, _("Request error: string table offset out of range")) | |||
|
51 | __err__(ERROR_RDONLY, _("Request error: update(ELF_C_WRITE) on read-only file")) | |||
|
52 | __err__(ERROR_IO_SEEK, _("I/O error: seek")) | |||
|
53 | __err__(ERROR_IO_2BIG, _("I/O error: file too big for memory")) | |||
|
54 | __err__(ERROR_IO_READ, _("I/O error: raw read")) | |||
|
55 | __err__(ERROR_IO_GETSIZE, _("I/O error: get file size")) | |||
|
56 | __err__(ERROR_IO_WRITE, _("I/O error: output write")) | |||
|
57 | __err__(ERROR_IO_TRUNC, _("I/O error: can't truncate output file")) | |||
|
58 | __err__(ERROR_VERSION_UNSET, _("Sequence error: must set ELF version first")) | |||
|
59 | __err__(ERROR_NOEHDR, _("Sequence error: must create ELF header first")) | |||
|
60 | __err__(ERROR_OUTSIDE, _("Format error: reference outside file")) | |||
|
61 | __err__(ERROR_TRUNC_ARHDR, _("Format error: archive header truncated")) | |||
|
62 | __err__(ERROR_ARFMAG, _("Format error: archive fmag")) | |||
|
63 | __err__(ERROR_ARHDR, _("Format error: archive header")) | |||
|
64 | __err__(ERROR_TRUNC_MEMBER, _("Format error: archive member truncated")) | |||
|
65 | __err__(ERROR_SIZE_ARSYMTAB, _("Format error: archive symbol table size")) | |||
|
66 | __err__(ERROR_ARSTRTAB, _("Format error: archive string table")) | |||
|
67 | __err__(ERROR_ARSPECIAL, _("Format error: archive special name unknown")) | |||
|
68 | __err__(ERROR_TRUNC_EHDR, _("Format error: ELF header truncated")) | |||
|
69 | __err__(ERROR_TRUNC_PHDR, _("Format error: program header table truncated")) | |||
|
70 | __err__(ERROR_TRUNC_SHDR, _("Format error: section header table truncated")) | |||
|
71 | __err__(ERROR_TRUNC_SCN, _("Format error: data region truncated")) | |||
|
72 | __err__(ERROR_ALIGN_PHDR, _("Format error: program header table alignment")) | |||
|
73 | __err__(ERROR_ALIGN_SHDR, _("Format error: section header table alignment")) | |||
|
74 | __err__(ERROR_VERDEF_FORMAT, _("Format error: bad parameter in Verdef record")) | |||
|
75 | __err__(ERROR_VERDEF_VERSION, _("Format error: unknown Verdef version")) | |||
|
76 | __err__(ERROR_VERNEED_FORMAT, _("Format error: bad parameter in Verneed record")) | |||
|
77 | __err__(ERROR_VERNEED_VERSION, _("Format error: unknown Verneed version")) | |||
|
78 | __err__(ERROR_EHDR_SHNUM, _("Format error: bad e_shnum value")) | |||
|
79 | __err__(ERROR_EHDR_SHENTSIZE, _("Format error: bad e_shentsize value")) | |||
|
80 | __err__(ERROR_EHDR_PHENTSIZE, _("Format error: bad e_phentsize value")) | |||
|
81 | __err__(ERROR_UNTERM, _("Format error: unterminated string in string table")) | |||
|
82 | __err__(ERROR_SCN2SMALL, _("Layout error: section size too small for data")) | |||
|
83 | __err__(ERROR_SCN_OVERLAP, _("Layout error: overlapping sections")) | |||
|
84 | __err__(ERROR_MEM_ELF, _("Memory error: elf descriptor")) | |||
|
85 | __err__(ERROR_MEM_ARSYMTAB, _("Memory error: archive symbol table")) | |||
|
86 | __err__(ERROR_MEM_ARHDR, _("Memory error: archive member header")) | |||
|
87 | __err__(ERROR_MEM_EHDR, _("Memory error: ELF header")) | |||
|
88 | __err__(ERROR_MEM_PHDR, _("Memory error: program header table")) | |||
|
89 | __err__(ERROR_MEM_SHDR, _("Memory error: section header table")) | |||
|
90 | __err__(ERROR_MEM_SCN, _("Memory error: section descriptor")) | |||
|
91 | __err__(ERROR_MEM_SCNDATA, _("Memory error: section data")) | |||
|
92 | __err__(ERROR_MEM_OUTBUF, _("Memory error: output file space")) | |||
|
93 | __err__(ERROR_MEM_TEMPORARY, _("Memory error: temporary buffer")) | |||
|
94 | __err__(ERROR_BADVALUE, _("GElf error: value out of range")) | |||
|
95 | __err__(ERROR_BADINDEX, _("GElf error: index out of range")) | |||
|
96 | __err__(ERROR_BADTYPE, _("GElf error: type mismatch")) | |||
|
97 | __err__(ERROR_MEM_SYM, _("GElf error: not enough memory for GElf_Sym")) | |||
|
98 | __err__(ERROR_MEM_DYN, _("GElf error: not enough memory for GElf_Dyn")) | |||
|
99 | __err__(ERROR_MEM_RELA, _("GElf error: not enough memory for GElf_Rela")) | |||
|
100 | __err__(ERROR_MEM_REL, _("GElf error: not enough memory for GElf_Rel")) |
@@ -0,0 +1,334 | |||||
|
1 | /* | |||
|
2 | ext_types.h - external representation of ELF data types. | |||
|
3 | Copyright (C) 1995 - 1998 Michael Riepe | |||
|
4 | ||||
|
5 | This library is free software; you can redistribute it and/or | |||
|
6 | modify it under the terms of the GNU Library General Public | |||
|
7 | License as published by the Free Software Foundation; either | |||
|
8 | version 2 of the License, or (at your option) any later version. | |||
|
9 | ||||
|
10 | This library is distributed in the hope that it will be useful, | |||
|
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | Library General Public License for more details. | |||
|
14 | ||||
|
15 | You should have received a copy of the GNU Library General Public | |||
|
16 | License along with this library; if not, write to the Free Software | |||
|
17 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | /* @(#) $Id: ext_types.h,v 1.9 2008/05/23 08:15:34 michael Exp $ */ | |||
|
21 | ||||
|
22 | #ifndef _EXT_TYPES_H | |||
|
23 | #define _EXT_TYPES_H | |||
|
24 | ||||
|
25 | #ifdef __cplusplus | |||
|
26 | extern "C" { | |||
|
27 | #endif /* __cplusplus */ | |||
|
28 | ||||
|
29 | /* | |||
|
30 | * Scalar data types | |||
|
31 | */ | |||
|
32 | typedef unsigned char __ext_Elf32_Addr [ELF32_FSZ_ADDR]; | |||
|
33 | typedef unsigned char __ext_Elf32_Half [ELF32_FSZ_HALF]; | |||
|
34 | typedef unsigned char __ext_Elf32_Off [ELF32_FSZ_OFF]; | |||
|
35 | typedef unsigned char __ext_Elf32_Sword [ELF32_FSZ_SWORD]; | |||
|
36 | typedef unsigned char __ext_Elf32_Word [ELF32_FSZ_WORD]; | |||
|
37 | ||||
|
38 | #if __LIBELF64 | |||
|
39 | ||||
|
40 | typedef unsigned char __ext_Elf32_Lword [8]; | |||
|
41 | ||||
|
42 | typedef unsigned char __ext_Elf64_Addr [ELF64_FSZ_ADDR]; | |||
|
43 | typedef unsigned char __ext_Elf64_Half [ELF64_FSZ_HALF]; | |||
|
44 | typedef unsigned char __ext_Elf64_Off [ELF64_FSZ_OFF]; | |||
|
45 | typedef unsigned char __ext_Elf64_Sword [ELF64_FSZ_SWORD]; | |||
|
46 | typedef unsigned char __ext_Elf64_Word [ELF64_FSZ_WORD]; | |||
|
47 | typedef unsigned char __ext_Elf64_Sxword[ELF64_FSZ_SXWORD]; | |||
|
48 | typedef unsigned char __ext_Elf64_Xword [ELF64_FSZ_XWORD]; | |||
|
49 | ||||
|
50 | typedef unsigned char __ext_Elf64_Lword [8]; | |||
|
51 | ||||
|
52 | #endif /* __LIBELF64 */ | |||
|
53 | ||||
|
54 | /* | |||
|
55 | * ELF header | |||
|
56 | */ | |||
|
57 | typedef struct { | |||
|
58 | unsigned char e_ident[EI_NIDENT]; | |||
|
59 | __ext_Elf32_Half e_type; | |||
|
60 | __ext_Elf32_Half e_machine; | |||
|
61 | __ext_Elf32_Word e_version; | |||
|
62 | __ext_Elf32_Addr e_entry; | |||
|
63 | __ext_Elf32_Off e_phoff; | |||
|
64 | __ext_Elf32_Off e_shoff; | |||
|
65 | __ext_Elf32_Word e_flags; | |||
|
66 | __ext_Elf32_Half e_ehsize; | |||
|
67 | __ext_Elf32_Half e_phentsize; | |||
|
68 | __ext_Elf32_Half e_phnum; | |||
|
69 | __ext_Elf32_Half e_shentsize; | |||
|
70 | __ext_Elf32_Half e_shnum; | |||
|
71 | __ext_Elf32_Half e_shstrndx; | |||
|
72 | } __ext_Elf32_Ehdr; | |||
|
73 | ||||
|
74 | #if __LIBELF64 | |||
|
75 | typedef struct { | |||
|
76 | unsigned char e_ident[EI_NIDENT]; | |||
|
77 | __ext_Elf64_Half e_type; | |||
|
78 | __ext_Elf64_Half e_machine; | |||
|
79 | __ext_Elf64_Word e_version; | |||
|
80 | __ext_Elf64_Addr e_entry; | |||
|
81 | __ext_Elf64_Off e_phoff; | |||
|
82 | __ext_Elf64_Off e_shoff; | |||
|
83 | __ext_Elf64_Word e_flags; | |||
|
84 | __ext_Elf64_Half e_ehsize; | |||
|
85 | __ext_Elf64_Half e_phentsize; | |||
|
86 | __ext_Elf64_Half e_phnum; | |||
|
87 | __ext_Elf64_Half e_shentsize; | |||
|
88 | __ext_Elf64_Half e_shnum; | |||
|
89 | __ext_Elf64_Half e_shstrndx; | |||
|
90 | } __ext_Elf64_Ehdr; | |||
|
91 | #endif /* __LIBELF64 */ | |||
|
92 | ||||
|
93 | /* | |||
|
94 | * Section header | |||
|
95 | */ | |||
|
96 | typedef struct { | |||
|
97 | __ext_Elf32_Word sh_name; | |||
|
98 | __ext_Elf32_Word sh_type; | |||
|
99 | __ext_Elf32_Word sh_flags; | |||
|
100 | __ext_Elf32_Addr sh_addr; | |||
|
101 | __ext_Elf32_Off sh_offset; | |||
|
102 | __ext_Elf32_Word sh_size; | |||
|
103 | __ext_Elf32_Word sh_link; | |||
|
104 | __ext_Elf32_Word sh_info; | |||
|
105 | __ext_Elf32_Word sh_addralign; | |||
|
106 | __ext_Elf32_Word sh_entsize; | |||
|
107 | } __ext_Elf32_Shdr; | |||
|
108 | ||||
|
109 | #if __LIBELF64 | |||
|
110 | typedef struct { | |||
|
111 | __ext_Elf64_Word sh_name; | |||
|
112 | __ext_Elf64_Word sh_type; | |||
|
113 | __ext_Elf64_Xword sh_flags; | |||
|
114 | __ext_Elf64_Addr sh_addr; | |||
|
115 | __ext_Elf64_Off sh_offset; | |||
|
116 | __ext_Elf64_Xword sh_size; | |||
|
117 | __ext_Elf64_Word sh_link; | |||
|
118 | __ext_Elf64_Word sh_info; | |||
|
119 | __ext_Elf64_Xword sh_addralign; | |||
|
120 | __ext_Elf64_Xword sh_entsize; | |||
|
121 | } __ext_Elf64_Shdr; | |||
|
122 | #endif /* __LIBELF64 */ | |||
|
123 | ||||
|
124 | /* | |||
|
125 | * Symbol table | |||
|
126 | */ | |||
|
127 | typedef struct { | |||
|
128 | __ext_Elf32_Word st_name; | |||
|
129 | __ext_Elf32_Addr st_value; | |||
|
130 | __ext_Elf32_Word st_size; | |||
|
131 | unsigned char st_info; | |||
|
132 | unsigned char st_other; | |||
|
133 | __ext_Elf32_Half st_shndx; | |||
|
134 | } __ext_Elf32_Sym; | |||
|
135 | ||||
|
136 | #if __LIBELF64 | |||
|
137 | typedef struct { | |||
|
138 | __ext_Elf64_Word st_name; | |||
|
139 | unsigned char st_info; | |||
|
140 | unsigned char st_other; | |||
|
141 | __ext_Elf64_Half st_shndx; | |||
|
142 | __ext_Elf64_Addr st_value; | |||
|
143 | __ext_Elf64_Xword st_size; | |||
|
144 | } __ext_Elf64_Sym; | |||
|
145 | #endif /* __LIBELF64 */ | |||
|
146 | ||||
|
147 | /* | |||
|
148 | * Relocation | |||
|
149 | */ | |||
|
150 | typedef struct { | |||
|
151 | __ext_Elf32_Addr r_offset; | |||
|
152 | __ext_Elf32_Word r_info; | |||
|
153 | } __ext_Elf32_Rel; | |||
|
154 | ||||
|
155 | typedef struct { | |||
|
156 | __ext_Elf32_Addr r_offset; | |||
|
157 | __ext_Elf32_Word r_info; | |||
|
158 | __ext_Elf32_Sword r_addend; | |||
|
159 | } __ext_Elf32_Rela; | |||
|
160 | ||||
|
161 | #if __LIBELF64 | |||
|
162 | typedef struct { | |||
|
163 | __ext_Elf64_Addr r_offset; | |||
|
164 | #if __LIBELF64_IRIX | |||
|
165 | __ext_Elf64_Word r_sym; | |||
|
166 | unsigned char r_ssym; | |||
|
167 | unsigned char r_type3; | |||
|
168 | unsigned char r_type2; | |||
|
169 | unsigned char r_type; | |||
|
170 | #else /* __LIBELF64_IRIX */ | |||
|
171 | __ext_Elf64_Xword r_info; | |||
|
172 | #endif /* __LIBELF64_IRIX */ | |||
|
173 | } __ext_Elf64_Rel; | |||
|
174 | ||||
|
175 | typedef struct { | |||
|
176 | __ext_Elf64_Addr r_offset; | |||
|
177 | #if __LIBELF64_IRIX | |||
|
178 | __ext_Elf64_Word r_sym; | |||
|
179 | unsigned char r_ssym; | |||
|
180 | unsigned char r_type3; | |||
|
181 | unsigned char r_type2; | |||
|
182 | unsigned char r_type; | |||
|
183 | #else /* __LIBELF64_IRIX */ | |||
|
184 | __ext_Elf64_Xword r_info; | |||
|
185 | #endif /* __LIBELF64_IRIX */ | |||
|
186 | __ext_Elf64_Sxword r_addend; | |||
|
187 | } __ext_Elf64_Rela; | |||
|
188 | #endif /* __LIBELF64 */ | |||
|
189 | ||||
|
190 | /* | |||
|
191 | * Program header | |||
|
192 | */ | |||
|
193 | typedef struct { | |||
|
194 | __ext_Elf32_Word p_type; | |||
|
195 | __ext_Elf32_Off p_offset; | |||
|
196 | __ext_Elf32_Addr p_vaddr; | |||
|
197 | __ext_Elf32_Addr p_paddr; | |||
|
198 | __ext_Elf32_Word p_filesz; | |||
|
199 | __ext_Elf32_Word p_memsz; | |||
|
200 | __ext_Elf32_Word p_flags; | |||
|
201 | __ext_Elf32_Word p_align; | |||
|
202 | } __ext_Elf32_Phdr; | |||
|
203 | ||||
|
204 | #if __LIBELF64 | |||
|
205 | typedef struct { | |||
|
206 | __ext_Elf64_Word p_type; | |||
|
207 | __ext_Elf64_Word p_flags; | |||
|
208 | __ext_Elf64_Off p_offset; | |||
|
209 | __ext_Elf64_Addr p_vaddr; | |||
|
210 | __ext_Elf64_Addr p_paddr; | |||
|
211 | __ext_Elf64_Xword p_filesz; | |||
|
212 | __ext_Elf64_Xword p_memsz; | |||
|
213 | __ext_Elf64_Xword p_align; | |||
|
214 | } __ext_Elf64_Phdr; | |||
|
215 | #endif /* __LIBELF64 */ | |||
|
216 | ||||
|
217 | /* | |||
|
218 | * Dynamic structure | |||
|
219 | */ | |||
|
220 | typedef struct { | |||
|
221 | __ext_Elf32_Sword d_tag; | |||
|
222 | union { | |||
|
223 | __ext_Elf32_Word d_val; | |||
|
224 | __ext_Elf32_Addr d_ptr; | |||
|
225 | } d_un; | |||
|
226 | } __ext_Elf32_Dyn; | |||
|
227 | ||||
|
228 | #if __LIBELF64 | |||
|
229 | typedef struct { | |||
|
230 | __ext_Elf64_Sxword d_tag; | |||
|
231 | union { | |||
|
232 | __ext_Elf64_Xword d_val; | |||
|
233 | __ext_Elf64_Addr d_ptr; | |||
|
234 | } d_un; | |||
|
235 | } __ext_Elf64_Dyn; | |||
|
236 | #endif /* __LIBELF64 */ | |||
|
237 | ||||
|
238 | /* | |||
|
239 | * Version definitions | |||
|
240 | */ | |||
|
241 | typedef struct { | |||
|
242 | __ext_Elf32_Half vd_version; | |||
|
243 | __ext_Elf32_Half vd_flags; | |||
|
244 | __ext_Elf32_Half vd_ndx; | |||
|
245 | __ext_Elf32_Half vd_cnt; | |||
|
246 | __ext_Elf32_Word vd_hash; | |||
|
247 | __ext_Elf32_Word vd_aux; | |||
|
248 | __ext_Elf32_Word vd_next; | |||
|
249 | } __ext_Elf32_Verdef; | |||
|
250 | ||||
|
251 | typedef struct { | |||
|
252 | __ext_Elf32_Word vda_name; | |||
|
253 | __ext_Elf32_Word vda_next; | |||
|
254 | } __ext_Elf32_Verdaux; | |||
|
255 | ||||
|
256 | typedef struct { | |||
|
257 | __ext_Elf32_Half vn_version; | |||
|
258 | __ext_Elf32_Half vn_cnt; | |||
|
259 | __ext_Elf32_Word vn_file; | |||
|
260 | __ext_Elf32_Word vn_aux; | |||
|
261 | __ext_Elf32_Word vn_next; | |||
|
262 | } __ext_Elf32_Verneed; | |||
|
263 | ||||
|
264 | typedef struct { | |||
|
265 | __ext_Elf32_Word vna_hash; | |||
|
266 | __ext_Elf32_Half vna_flags; | |||
|
267 | __ext_Elf32_Half vna_other; | |||
|
268 | __ext_Elf32_Word vna_name; | |||
|
269 | __ext_Elf32_Word vna_next; | |||
|
270 | } __ext_Elf32_Vernaux; | |||
|
271 | ||||
|
272 | #if __LIBELF64 | |||
|
273 | ||||
|
274 | typedef struct { | |||
|
275 | __ext_Elf64_Half vd_version; | |||
|
276 | __ext_Elf64_Half vd_flags; | |||
|
277 | __ext_Elf64_Half vd_ndx; | |||
|
278 | __ext_Elf64_Half vd_cnt; | |||
|
279 | __ext_Elf64_Word vd_hash; | |||
|
280 | __ext_Elf64_Word vd_aux; | |||
|
281 | __ext_Elf64_Word vd_next; | |||
|
282 | } __ext_Elf64_Verdef; | |||
|
283 | ||||
|
284 | typedef struct { | |||
|
285 | __ext_Elf64_Word vda_name; | |||
|
286 | __ext_Elf64_Word vda_next; | |||
|
287 | } __ext_Elf64_Verdaux; | |||
|
288 | ||||
|
289 | typedef struct { | |||
|
290 | __ext_Elf64_Half vn_version; | |||
|
291 | __ext_Elf64_Half vn_cnt; | |||
|
292 | __ext_Elf64_Word vn_file; | |||
|
293 | __ext_Elf64_Word vn_aux; | |||
|
294 | __ext_Elf64_Word vn_next; | |||
|
295 | } __ext_Elf64_Verneed; | |||
|
296 | ||||
|
297 | typedef struct { | |||
|
298 | __ext_Elf64_Word vna_hash; | |||
|
299 | __ext_Elf64_Half vna_flags; | |||
|
300 | __ext_Elf64_Half vna_other; | |||
|
301 | __ext_Elf64_Word vna_name; | |||
|
302 | __ext_Elf64_Word vna_next; | |||
|
303 | } __ext_Elf64_Vernaux; | |||
|
304 | ||||
|
305 | #endif /* __LIBELF64 */ | |||
|
306 | ||||
|
307 | /* | |||
|
308 | * Move section | |||
|
309 | */ | |||
|
310 | #if __LIBELF64 | |||
|
311 | ||||
|
312 | typedef struct { | |||
|
313 | __ext_Elf32_Lword m_value; | |||
|
314 | __ext_Elf32_Word m_info; | |||
|
315 | __ext_Elf32_Word m_poffset; | |||
|
316 | __ext_Elf32_Half m_repeat; | |||
|
317 | __ext_Elf32_Half m_stride; | |||
|
318 | } __ext_Elf32_Move; | |||
|
319 | ||||
|
320 | typedef struct { | |||
|
321 | __ext_Elf64_Lword m_value; | |||
|
322 | __ext_Elf64_Xword m_info; | |||
|
323 | __ext_Elf64_Xword m_poffset; | |||
|
324 | __ext_Elf64_Half m_repeat; | |||
|
325 | __ext_Elf64_Half m_stride; | |||
|
326 | } __ext_Elf64_Move; | |||
|
327 | ||||
|
328 | #endif /* __LIBELF64 */ | |||
|
329 | ||||
|
330 | #ifdef __cplusplus | |||
|
331 | } | |||
|
332 | #endif /* __cplusplus */ | |||
|
333 | ||||
|
334 | #endif /* _EXT_TYPES_H */ |
@@ -0,0 +1,155 | |||||
|
1 | /* | |||
|
2 | * gelf.h - public header file for libelf. | |||
|
3 | * Copyright (C) 2000 - 2006 Michael Riepe | |||
|
4 | * | |||
|
5 | * This library is free software; you can redistribute it and/or | |||
|
6 | * modify it under the terms of the GNU Library General Public | |||
|
7 | * License as published by the Free Software Foundation; either | |||
|
8 | * version 2 of the License, or (at your option) any later version. | |||
|
9 | * | |||
|
10 | * This library is distributed in the hope that it will be useful, | |||
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | * Library General Public License for more details. | |||
|
14 | * | |||
|
15 | * You should have received a copy of the GNU Library General Public | |||
|
16 | * License along with this library; if not, write to the Free Software | |||
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | /* @(#) $Id: gelf.h,v 1.16 2008/05/23 08:15:34 michael Exp $ */ | |||
|
21 | ||||
|
22 | #ifndef _GELF_H | |||
|
23 | #define _GELF_H | |||
|
24 | ||||
|
25 | #if __LIBELF_INTERNAL__ | |||
|
26 | #include <libelf.h> | |||
|
27 | #else /* __LIBELF_INTERNAL__ */ | |||
|
28 | #include <libelf/libelf.h> | |||
|
29 | #endif /* __LIBELF_INTERNAL__ */ | |||
|
30 | ||||
|
31 | #if __LIBELF_NEED_LINK_H | |||
|
32 | #include <link.h> | |||
|
33 | #elif __LIBELF_NEED_SYS_LINK_H | |||
|
34 | #include <sys/link.h> | |||
|
35 | #endif /* __LIBELF_NEED_LINK_H */ | |||
|
36 | ||||
|
37 | #ifdef __cplusplus | |||
|
38 | extern "C" { | |||
|
39 | #endif /* __cplusplus */ | |||
|
40 | ||||
|
41 | #ifndef __P | |||
|
42 | # if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32) | |||
|
43 | # define __P(args) args | |||
|
44 | # else /* __STDC__ || defined(__cplusplus) */ | |||
|
45 | # define __P(args) () | |||
|
46 | # endif /* __STDC__ || defined(__cplusplus) */ | |||
|
47 | #endif /* __P */ | |||
|
48 | ||||
|
49 | #if !__LIBELF64 | |||
|
50 | ||||
|
51 | #error "GElf is not supported on this system." | |||
|
52 | ||||
|
53 | #else /* __LIBELF64 */ | |||
|
54 | ||||
|
55 | typedef Elf64_Addr GElf_Addr; | |||
|
56 | typedef Elf64_Half GElf_Half; | |||
|
57 | typedef Elf64_Off GElf_Off; | |||
|
58 | typedef Elf64_Sword GElf_Sword; | |||
|
59 | typedef Elf64_Word GElf_Word; | |||
|
60 | typedef Elf64_Sxword GElf_Sxword; | |||
|
61 | typedef Elf64_Xword GElf_Xword; | |||
|
62 | ||||
|
63 | typedef Elf64_Ehdr GElf_Ehdr; | |||
|
64 | typedef Elf64_Phdr GElf_Phdr; | |||
|
65 | typedef Elf64_Shdr GElf_Shdr; | |||
|
66 | typedef Elf64_Dyn GElf_Dyn; | |||
|
67 | typedef Elf64_Rel GElf_Rel; | |||
|
68 | typedef Elf64_Rela GElf_Rela; | |||
|
69 | typedef Elf64_Sym GElf_Sym; | |||
|
70 | ||||
|
71 | /* | |||
|
72 | * Symbol versioning | |||
|
73 | */ | |||
|
74 | #if __LIBELF_SYMBOL_VERSIONS | |||
|
75 | typedef Elf64_Verdef GElf_Verdef; | |||
|
76 | typedef Elf64_Verneed GElf_Verneed; | |||
|
77 | typedef Elf64_Verdaux GElf_Verdaux; | |||
|
78 | typedef Elf64_Vernaux GElf_Vernaux; | |||
|
79 | #endif /* __LIBELF_SYMBOL_VERSIONS */ | |||
|
80 | ||||
|
81 | /* | |||
|
82 | * These types aren't implemented (yet) | |||
|
83 | * | |||
|
84 | typedef Elf64_Move GElf_Move; | |||
|
85 | typedef Elf64_Syminfo GElf_Syminfo; | |||
|
86 | */ | |||
|
87 | ||||
|
88 | /* | |||
|
89 | * Generic macros | |||
|
90 | */ | |||
|
91 | #define GELF_ST_BIND ELF64_ST_BIND | |||
|
92 | #define GELF_ST_TYPE ELF64_ST_TYPE | |||
|
93 | #define GELF_ST_INFO ELF64_ST_INFO | |||
|
94 | ||||
|
95 | #define GELF_R_TYPE ELF64_R_TYPE | |||
|
96 | #define GELF_R_SYM ELF64_R_SYM | |||
|
97 | #define GELF_R_INFO ELF64_R_INFO | |||
|
98 | ||||
|
99 | /* | |||
|
100 | * Function declarations | |||
|
101 | */ | |||
|
102 | extern int gelf_getclass __P((Elf *__elf)); | |||
|
103 | ||||
|
104 | extern size_t gelf_fsize __P((Elf *__elf, Elf_Type __type, size_t __count, unsigned __ver)); | |||
|
105 | ||||
|
106 | extern Elf_Data *gelf_xlatetof __P((Elf *__elf, Elf_Data *__dst, const Elf_Data *__src, unsigned __encode)); | |||
|
107 | extern Elf_Data *gelf_xlatetom __P((Elf *__elf, Elf_Data *__dst, const Elf_Data *__src, unsigned __encode)); | |||
|
108 | ||||
|
109 | extern GElf_Ehdr *gelf_getehdr __P((Elf *__elf, GElf_Ehdr *__dst)); | |||
|
110 | extern int gelf_update_ehdr __P((Elf *__elf, GElf_Ehdr *__src)); | |||
|
111 | extern unsigned long gelf_newehdr __P((Elf *__elf, int __elfclass)); | |||
|
112 | ||||
|
113 | extern GElf_Phdr *gelf_getphdr __P((Elf *__elf, int ndx, GElf_Phdr *__dst)); | |||
|
114 | extern int gelf_update_phdr __P((Elf *__elf, int ndx, GElf_Phdr *__src)); | |||
|
115 | extern unsigned long gelf_newphdr __P((Elf *__elf, size_t __phnum)); | |||
|
116 | ||||
|
117 | extern GElf_Shdr *gelf_getshdr __P((Elf_Scn *__scn, GElf_Shdr *__dst)); | |||
|
118 | extern int gelf_update_shdr __P((Elf_Scn *__scn, GElf_Shdr *__src)); | |||
|
119 | ||||
|
120 | extern GElf_Dyn *gelf_getdyn __P((Elf_Data *__src, int __ndx, GElf_Dyn *__dst)); | |||
|
121 | extern int gelf_update_dyn __P((Elf_Data *__dst, int __ndx, GElf_Dyn *__src)); | |||
|
122 | ||||
|
123 | extern GElf_Rel *gelf_getrel __P((Elf_Data *__src, int __ndx, GElf_Rel *__dst)); | |||
|
124 | extern int gelf_update_rel __P((Elf_Data *__dst, int __ndx, GElf_Rel *__src)); | |||
|
125 | ||||
|
126 | extern GElf_Rela *gelf_getrela __P((Elf_Data *__src, int __ndx, GElf_Rela *__dst)); | |||
|
127 | extern int gelf_update_rela __P((Elf_Data *__dst, int __ndx, GElf_Rela *__src)); | |||
|
128 | ||||
|
129 | extern GElf_Sym *gelf_getsym __P((Elf_Data *__src, int __ndx, GElf_Sym *__dst)); | |||
|
130 | extern int gelf_update_sym __P((Elf_Data *__dst, int __ndx, GElf_Sym *__src)); | |||
|
131 | ||||
|
132 | extern long gelf_checksum __P((Elf *__elf)); | |||
|
133 | ||||
|
134 | /* | |||
|
135 | * These functions aren't implemented (yet) | |||
|
136 | * | |||
|
137 | extern GElf_Move *gelf_getmove __P((Elf_Data *__src, int __ndx, GElf_Move *__src)); | |||
|
138 | extern int gelf_update_move __P((Elf_Data *__dst, int __ndx, GElf_Move *__src)); | |||
|
139 | * | |||
|
140 | extern GElf_Syminfo* gelf_getsyminfo __P((Elf_Data *__src, int __ndx, GElf_Syminfo *__dst)); | |||
|
141 | extern int gelf_update_syminfo __P((Elf_Data *__dst, int __ndx, GElf_Syminfo *__src)); | |||
|
142 | */ | |||
|
143 | ||||
|
144 | /* | |||
|
145 | * Extensions (not available in other versions of libelf) | |||
|
146 | */ | |||
|
147 | extern size_t gelf_msize __P((Elf *__elf, Elf_Type __type, size_t __count, unsigned __ver)); | |||
|
148 | ||||
|
149 | #endif /* __LIBELF64 */ | |||
|
150 | ||||
|
151 | #ifdef __cplusplus | |||
|
152 | } | |||
|
153 | #endif /* __cplusplus */ | |||
|
154 | ||||
|
155 | #endif /* _GELF_H */ |
@@ -0,0 +1,305 | |||||
|
1 | /* | |||
|
2 | * libelf.h - public header file for libelf. | |||
|
3 | * Copyright (C) 1995 - 2008 Michael Riepe | |||
|
4 | * | |||
|
5 | * This library is free software; you can redistribute it and/or | |||
|
6 | * modify it under the terms of the GNU Library General Public | |||
|
7 | * License as published by the Free Software Foundation; either | |||
|
8 | * version 2 of the License, or (at your option) any later version. | |||
|
9 | * | |||
|
10 | * This library is distributed in the hope that it will be useful, | |||
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | * Library General Public License for more details. | |||
|
14 | * | |||
|
15 | * You should have received a copy of the GNU Library General Public | |||
|
16 | * License along with this library; if not, write to the Free Software | |||
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | /* @(#) $Id: libelf.h,v 1.29 2009/07/07 17:57:43 michael Exp $ */ | |||
|
21 | ||||
|
22 | #ifndef _LIBELF_H | |||
|
23 | #define _LIBELF_H | |||
|
24 | ||||
|
25 | #include <stddef.h> /* for size_t */ | |||
|
26 | #include <sys/types.h> | |||
|
27 | ||||
|
28 | #if __LIBELF_INTERNAL__ | |||
|
29 | #include <sys_elf.h> | |||
|
30 | #else /* __LIBELF_INTERNAL__ */ | |||
|
31 | #include <libelf/sys_elf.h> | |||
|
32 | #endif /* __LIBELF_INTERNAL__ */ | |||
|
33 | ||||
|
34 | #if defined __GNUC__ && !defined __cplusplus | |||
|
35 | #define DEPRECATED __attribute__((deprecated)) | |||
|
36 | #else | |||
|
37 | #define DEPRECATED /* nothing */ | |||
|
38 | #endif | |||
|
39 | ||||
|
40 | #ifdef __cplusplus | |||
|
41 | extern "C" { | |||
|
42 | #endif /* __cplusplus */ | |||
|
43 | ||||
|
44 | #ifndef __P | |||
|
45 | # if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32) | |||
|
46 | # define __P(args) args | |||
|
47 | # else /* __STDC__ || defined(__cplusplus) */ | |||
|
48 | # define __P(args) () | |||
|
49 | # endif /* __STDC__ || defined(__cplusplus) */ | |||
|
50 | #endif /* __P */ | |||
|
51 | ||||
|
52 | /* | |||
|
53 | * Commands | |||
|
54 | */ | |||
|
55 | typedef enum { | |||
|
56 | ELF_C_NULL = 0, /* must be first, 0 */ | |||
|
57 | ELF_C_READ, | |||
|
58 | ELF_C_WRITE, | |||
|
59 | ELF_C_CLR, | |||
|
60 | ELF_C_SET, | |||
|
61 | ELF_C_FDDONE, | |||
|
62 | ELF_C_FDREAD, | |||
|
63 | ELF_C_RDWR, | |||
|
64 | ELF_C_NUM /* must be last */ | |||
|
65 | } Elf_Cmd; | |||
|
66 | ||||
|
67 | /* | |||
|
68 | * Flags | |||
|
69 | */ | |||
|
70 | #define ELF_F_DIRTY 0x1 | |||
|
71 | #define ELF_F_LAYOUT 0x4 | |||
|
72 | /* | |||
|
73 | * Allow sections to overlap when ELF_F_LAYOUT is in effect. | |||
|
74 | * Note that this flag ist NOT portable, and that it may render | |||
|
75 | * the output file unusable. Use with extreme caution! | |||
|
76 | */ | |||
|
77 | #define ELF_F_LAYOUT_OVERLAP 0x10000000 | |||
|
78 | ||||
|
79 | /* | |||
|
80 | * File types | |||
|
81 | */ | |||
|
82 | typedef enum { | |||
|
83 | ELF_K_NONE = 0, /* must be first, 0 */ | |||
|
84 | ELF_K_AR, | |||
|
85 | ELF_K_COFF, | |||
|
86 | ELF_K_ELF, | |||
|
87 | ELF_K_NUM /* must be last */ | |||
|
88 | } Elf_Kind; | |||
|
89 | ||||
|
90 | /* | |||
|
91 | * Data types | |||
|
92 | */ | |||
|
93 | typedef enum { | |||
|
94 | ELF_T_BYTE = 0, /* must be first, 0 */ | |||
|
95 | ELF_T_ADDR, | |||
|
96 | ELF_T_DYN, | |||
|
97 | ELF_T_EHDR, | |||
|
98 | ELF_T_HALF, | |||
|
99 | ELF_T_OFF, | |||
|
100 | ELF_T_PHDR, | |||
|
101 | ELF_T_RELA, | |||
|
102 | ELF_T_REL, | |||
|
103 | ELF_T_SHDR, | |||
|
104 | ELF_T_SWORD, | |||
|
105 | ELF_T_SYM, | |||
|
106 | ELF_T_WORD, | |||
|
107 | /* | |||
|
108 | * New stuff for 64-bit. | |||
|
109 | * | |||
|
110 | * Most implementations add ELF_T_SXWORD after ELF_T_SWORD | |||
|
111 | * which breaks binary compatibility with earlier versions. | |||
|
112 | * If this causes problems for you, contact me. | |||
|
113 | */ | |||
|
114 | ELF_T_SXWORD, | |||
|
115 | ELF_T_XWORD, | |||
|
116 | /* | |||
|
117 | * Symbol versioning. Sun broke binary compatibility (again!), | |||
|
118 | * but I won't. | |||
|
119 | */ | |||
|
120 | ELF_T_VDEF, | |||
|
121 | ELF_T_VNEED, | |||
|
122 | ELF_T_NUM /* must be last */ | |||
|
123 | } Elf_Type; | |||
|
124 | ||||
|
125 | /* | |||
|
126 | * Elf descriptor | |||
|
127 | */ | |||
|
128 | typedef struct Elf Elf; | |||
|
129 | ||||
|
130 | /* | |||
|
131 | * Section descriptor | |||
|
132 | */ | |||
|
133 | typedef struct Elf_Scn Elf_Scn; | |||
|
134 | ||||
|
135 | /* | |||
|
136 | * Archive member header | |||
|
137 | */ | |||
|
138 | typedef struct { | |||
|
139 | char* ar_name; | |||
|
140 | time_t ar_date; | |||
|
141 | long ar_uid; | |||
|
142 | long ar_gid; | |||
|
143 | unsigned long ar_mode; | |||
|
144 | off_t ar_size; | |||
|
145 | char* ar_rawname; | |||
|
146 | } Elf_Arhdr; | |||
|
147 | ||||
|
148 | /* | |||
|
149 | * Archive symbol table | |||
|
150 | */ | |||
|
151 | typedef struct { | |||
|
152 | char* as_name; | |||
|
153 | size_t as_off; | |||
|
154 | unsigned long as_hash; | |||
|
155 | } Elf_Arsym; | |||
|
156 | ||||
|
157 | /* | |||
|
158 | * Data descriptor | |||
|
159 | */ | |||
|
160 | typedef struct { | |||
|
161 | void* d_buf; | |||
|
162 | Elf_Type d_type; | |||
|
163 | size_t d_size; | |||
|
164 | off_t d_off; | |||
|
165 | size_t d_align; | |||
|
166 | unsigned d_version; | |||
|
167 | } Elf_Data; | |||
|
168 | ||||
|
169 | /* | |||
|
170 | * Function declarations | |||
|
171 | */ | |||
|
172 | extern Elf *elf_begin __P((int __fd, Elf_Cmd __cmd, Elf *__ref)); | |||
|
173 | extern Elf *elf_memory __P((char *__image, size_t __size)); | |||
|
174 | extern int elf_cntl __P((Elf *__elf, Elf_Cmd __cmd)); | |||
|
175 | extern int elf_end __P((Elf *__elf)); | |||
|
176 | extern const char *elf_errmsg __P((int __err)); | |||
|
177 | extern int elf_errno __P((void)); | |||
|
178 | extern void elf_fill __P((int __fill)); | |||
|
179 | extern unsigned elf_flagdata __P((Elf_Data *__data, Elf_Cmd __cmd, | |||
|
180 | unsigned __flags)); | |||
|
181 | extern unsigned elf_flagehdr __P((Elf *__elf, Elf_Cmd __cmd, | |||
|
182 | unsigned __flags)); | |||
|
183 | extern unsigned elf_flagelf __P((Elf *__elf, Elf_Cmd __cmd, | |||
|
184 | unsigned __flags)); | |||
|
185 | extern unsigned elf_flagphdr __P((Elf *__elf, Elf_Cmd __cmd, | |||
|
186 | unsigned __flags)); | |||
|
187 | extern unsigned elf_flagscn __P((Elf_Scn *__scn, Elf_Cmd __cmd, | |||
|
188 | unsigned __flags)); | |||
|
189 | extern unsigned elf_flagshdr __P((Elf_Scn *__scn, Elf_Cmd __cmd, | |||
|
190 | unsigned __flags)); | |||
|
191 | extern size_t elf32_fsize __P((Elf_Type __type, size_t __count, | |||
|
192 | unsigned __ver)); | |||
|
193 | extern Elf_Arhdr *elf_getarhdr __P((Elf *__elf)); | |||
|
194 | extern Elf_Arsym *elf_getarsym __P((Elf *__elf, size_t *__ptr)); | |||
|
195 | extern off_t elf_getbase __P((Elf *__elf)); | |||
|
196 | extern Elf_Data *elf_getdata __P((Elf_Scn *__scn, Elf_Data *__data)); | |||
|
197 | extern Elf32_Ehdr *elf32_getehdr __P((Elf *__elf)); | |||
|
198 | extern char *elf_getident __P((Elf *__elf, size_t *__ptr)); | |||
|
199 | extern Elf32_Phdr *elf32_getphdr __P((Elf *__elf)); | |||
|
200 | extern Elf_Scn *elf_getscn __P((Elf *__elf, size_t __index)); | |||
|
201 | extern Elf32_Shdr *elf32_getshdr __P((Elf_Scn *__scn)); | |||
|
202 | extern unsigned long elf_hash __P((const unsigned char *__name)); | |||
|
203 | extern Elf_Kind elf_kind __P((Elf *__elf)); | |||
|
204 | extern size_t elf_ndxscn __P((Elf_Scn *__scn)); | |||
|
205 | extern Elf_Data *elf_newdata __P((Elf_Scn *__scn)); | |||
|
206 | extern Elf32_Ehdr *elf32_newehdr __P((Elf *__elf)); | |||
|
207 | extern Elf32_Phdr *elf32_newphdr __P((Elf *__elf, size_t __count)); | |||
|
208 | extern Elf_Scn *elf_newscn __P((Elf *__elf)); | |||
|
209 | extern Elf_Cmd elf_next __P((Elf *__elf)); | |||
|
210 | extern Elf_Scn *elf_nextscn __P((Elf *__elf, Elf_Scn *__scn)); | |||
|
211 | extern size_t elf_rand __P((Elf *__elf, size_t __offset)); | |||
|
212 | extern Elf_Data *elf_rawdata __P((Elf_Scn *__scn, Elf_Data *__data)); | |||
|
213 | extern char *elf_rawfile __P((Elf *__elf, size_t *__ptr)); | |||
|
214 | extern char *elf_strptr __P((Elf *__elf, size_t __section, size_t __offset)); | |||
|
215 | extern off_t elf_update __P((Elf *__elf, Elf_Cmd __cmd)); | |||
|
216 | extern unsigned elf_version __P((unsigned __ver)); | |||
|
217 | extern Elf_Data *elf32_xlatetof __P((Elf_Data *__dst, const Elf_Data *__src, | |||
|
218 | unsigned __encode)); | |||
|
219 | extern Elf_Data *elf32_xlatetom __P((Elf_Data *__dst, const Elf_Data *__src, | |||
|
220 | unsigned __encode)); | |||
|
221 | ||||
|
222 | /* | |||
|
223 | * Additional functions found on Solaris | |||
|
224 | */ | |||
|
225 | extern long elf32_checksum __P((Elf *__elf)); | |||
|
226 | ||||
|
227 | #if __LIBELF64 | |||
|
228 | /* | |||
|
229 | * 64-bit ELF functions | |||
|
230 | * Not available on all platforms | |||
|
231 | */ | |||
|
232 | extern Elf64_Ehdr *elf64_getehdr __P((Elf *__elf)); | |||
|
233 | extern Elf64_Ehdr *elf64_newehdr __P((Elf *__elf)); | |||
|
234 | extern Elf64_Phdr *elf64_getphdr __P((Elf *__elf)); | |||
|
235 | extern Elf64_Phdr *elf64_newphdr __P((Elf *__elf, size_t __count)); | |||
|
236 | extern Elf64_Shdr *elf64_getshdr __P((Elf_Scn *__scn)); | |||
|
237 | extern size_t elf64_fsize __P((Elf_Type __type, size_t __count, | |||
|
238 | unsigned __ver)); | |||
|
239 | extern Elf_Data *elf64_xlatetof __P((Elf_Data *__dst, const Elf_Data *__src, | |||
|
240 | unsigned __encode)); | |||
|
241 | extern Elf_Data *elf64_xlatetom __P((Elf_Data *__dst, const Elf_Data *__src, | |||
|
242 | unsigned __encode)); | |||
|
243 | ||||
|
244 | /* | |||
|
245 | * Additional functions found on Solaris | |||
|
246 | */ | |||
|
247 | extern long elf64_checksum __P((Elf *__elf)); | |||
|
248 | ||||
|
249 | #endif /* __LIBELF64 */ | |||
|
250 | ||||
|
251 | /* | |||
|
252 | * ELF format extensions | |||
|
253 | * | |||
|
254 | * These functions return 0 on failure, 1 on success. Since other | |||
|
255 | * implementations of libelf may behave differently (there was quite | |||
|
256 | * some confusion about the correct values), they are now officially | |||
|
257 | * deprecated and should be replaced with the three new functions below. | |||
|
258 | */ | |||
|
259 | DEPRECATED extern int elf_getphnum __P((Elf *__elf, size_t *__resultp)); | |||
|
260 | DEPRECATED extern int elf_getshnum __P((Elf *__elf, size_t *__resultp)); | |||
|
261 | DEPRECATED extern int elf_getshstrndx __P((Elf *__elf, size_t *__resultp)); | |||
|
262 | /* | |||
|
263 | * Replacement functions (return -1 on failure, 0 on success). | |||
|
264 | */ | |||
|
265 | extern int elf_getphdrnum __P((Elf *__elf, size_t *__resultp)); | |||
|
266 | extern int elf_getshdrnum __P((Elf *__elf, size_t *__resultp)); | |||
|
267 | extern int elf_getshdrstrndx __P((Elf *__elf, size_t *__resultp)); | |||
|
268 | ||||
|
269 | /* | |||
|
270 | * Convenience functions | |||
|
271 | * | |||
|
272 | * elfx_update_shstrndx is elf_getshstrndx's counterpart. | |||
|
273 | * It should be used to set the e_shstrndx member. | |||
|
274 | * There is no update function for e_shnum or e_phnum | |||
|
275 | * because libelf handles them internally. | |||
|
276 | */ | |||
|
277 | extern int elfx_update_shstrndx __P((Elf *__elf, size_t __index)); | |||
|
278 | ||||
|
279 | /* | |||
|
280 | * Experimental extensions: | |||
|
281 | * | |||
|
282 | * elfx_movscn() moves section `__scn' directly after section `__after'. | |||
|
283 | * elfx_remscn() removes section `__scn'. Both functions update | |||
|
284 | * the section indices; elfx_remscn() also adjusts the ELF header's | |||
|
285 | * e_shnum member. The application is responsible for updating other | |||
|
286 | * data (in particular, e_shstrndx and the section headers' sh_link and | |||
|
287 | * sh_info members). | |||
|
288 | * | |||
|
289 | * elfx_movscn() returns the new index of the moved section. | |||
|
290 | * elfx_remscn() returns the original index of the removed section. | |||
|
291 | * A return value of zero indicates an error. | |||
|
292 | */ | |||
|
293 | extern size_t elfx_movscn __P((Elf *__elf, Elf_Scn *__scn, Elf_Scn *__after)); | |||
|
294 | extern size_t elfx_remscn __P((Elf *__elf, Elf_Scn *__scn)); | |||
|
295 | ||||
|
296 | /* | |||
|
297 | * elf_delscn() is obsolete. Please use elfx_remscn() instead. | |||
|
298 | */ | |||
|
299 | extern size_t elf_delscn __P((Elf *__elf, Elf_Scn *__scn)); | |||
|
300 | ||||
|
301 | #ifdef __cplusplus | |||
|
302 | } | |||
|
303 | #endif /* __cplusplus */ | |||
|
304 | ||||
|
305 | #endif /* _LIBELF_H */ |
@@ -0,0 +1,48 | |||||
|
1 | /* | |||
|
2 | * nlist.h - public header file for nlist(3). | |||
|
3 | * Copyright (C) 1995 - 2006 Michael Riepe | |||
|
4 | * | |||
|
5 | * This library is free software; you can redistribute it and/or | |||
|
6 | * modify it under the terms of the GNU Library General Public | |||
|
7 | * License as published by the Free Software Foundation; either | |||
|
8 | * version 2 of the License, or (at your option) any later version. | |||
|
9 | * | |||
|
10 | * This library is distributed in the hope that it will be useful, | |||
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | * Library General Public License for more details. | |||
|
14 | * | |||
|
15 | * You should have received a copy of the GNU Library General Public | |||
|
16 | * License along with this library; if not, write to the Free Software | |||
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | /* @(#) $Id: nlist.h,v 1.10 2008/05/23 08:15:35 michael Exp $ */ | |||
|
21 | ||||
|
22 | #ifndef _NLIST_H | |||
|
23 | #define _NLIST_H | |||
|
24 | ||||
|
25 | #ifdef __cplusplus | |||
|
26 | extern "C" { | |||
|
27 | #endif /* __cplusplus */ | |||
|
28 | ||||
|
29 | struct nlist { | |||
|
30 | char* n_name; | |||
|
31 | long n_value; | |||
|
32 | short n_scnum; | |||
|
33 | unsigned short n_type; | |||
|
34 | char n_sclass; | |||
|
35 | char n_numaux; | |||
|
36 | }; | |||
|
37 | ||||
|
38 | #if (__STDC__ + 0) || defined(__cplusplus) || defined(_WIN32) | |||
|
39 | extern int nlist(const char *__filename, struct nlist *__nl); | |||
|
40 | #else /* __STDC__ || defined(__cplusplus) */ | |||
|
41 | extern int nlist(); | |||
|
42 | #endif /* __STDC__ || defined(__cplusplus) */ | |||
|
43 | ||||
|
44 | #ifdef __cplusplus | |||
|
45 | } | |||
|
46 | #endif /* __cplusplus */ | |||
|
47 | ||||
|
48 | #endif /* _NLIST_H */ |
@@ -0,0 +1,446 | |||||
|
1 | /* | |||
|
2 | * private.h - private definitions for libelf. | |||
|
3 | * Copyright (C) 1995 - 2007 Michael Riepe | |||
|
4 | * | |||
|
5 | * This library is free software; you can redistribute it and/or | |||
|
6 | * modify it under the terms of the GNU Library General Public | |||
|
7 | * License as published by the Free Software Foundation; either | |||
|
8 | * version 2 of the License, or (at your option) any later version. | |||
|
9 | * | |||
|
10 | * This library is distributed in the hope that it will be useful, | |||
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | * Library General Public License for more details. | |||
|
14 | * | |||
|
15 | * You should have received a copy of the GNU Library General Public | |||
|
16 | * License along with this library; if not, write to the Free Software | |||
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | /* @(#) $Id: private.h,v 1.40 2009/11/01 13:04:19 michael Exp $ */ | |||
|
21 | ||||
|
22 | #ifndef _PRIVATE_H | |||
|
23 | #define _PRIVATE_H | |||
|
24 | ||||
|
25 | #define __LIBELF_INTERNAL__ 1 | |||
|
26 | ||||
|
27 | #if HAVE_CONFIG_H | |||
|
28 | # include <config.h> | |||
|
29 | #endif /* HAVE_CONFIG_H */ | |||
|
30 | ||||
|
31 | /* | |||
|
32 | * Workaround for GLIBC bug: | |||
|
33 | * include <stdint.h> before <sys/types.h> | |||
|
34 | */ | |||
|
35 | #if HAVE_STDINT_H | |||
|
36 | #include <stdint.h> | |||
|
37 | #endif | |||
|
38 | #include <sys/types.h> | |||
|
39 | ||||
|
40 | #if STDC_HEADERS | |||
|
41 | # include <stdlib.h> | |||
|
42 | # include <string.h> | |||
|
43 | #else /* STDC_HEADERS */ | |||
|
44 | extern void *malloc(), *realloc(); | |||
|
45 | extern void free(), bcopy(), abort(); | |||
|
46 | extern int strcmp(), strncmp(), memcmp(); | |||
|
47 | extern void *memcpy(), *memmove(), *memset(); | |||
|
48 | #endif /* STDC_HEADERS */ | |||
|
49 | ||||
|
50 | #if defined(_WIN32) | |||
|
51 | #include <io.h> | |||
|
52 | #else | |||
|
53 | #if HAVE_UNISTD_H | |||
|
54 | # include <unistd.h> | |||
|
55 | #else /* HAVE_UNISTD_H */ | |||
|
56 | extern int read(), write(), close(); | |||
|
57 | extern off_t lseek(); | |||
|
58 | #if HAVE_FTRUNCATE | |||
|
59 | extern int ftruncate(); | |||
|
60 | #endif /* HAVE_FTRUNCATE */ | |||
|
61 | #endif /* HAVE_UNISTD_H */ | |||
|
62 | #endif /* defined(_WIN32) */ | |||
|
63 | ||||
|
64 | #ifndef SEEK_SET | |||
|
65 | #define SEEK_SET 0 | |||
|
66 | #endif /* SEEK_SET */ | |||
|
67 | #ifndef SEEK_CUR | |||
|
68 | #define SEEK_CUR 1 | |||
|
69 | #endif /* SEEK_CUR */ | |||
|
70 | #ifndef SEEK_END | |||
|
71 | #define SEEK_END 2 | |||
|
72 | #endif /* SEEK_END */ | |||
|
73 | ||||
|
74 | #if !HAVE_MEMCMP | |||
|
75 | # define memcmp strncmp | |||
|
76 | #endif /* !HAVE_MEMCMP */ | |||
|
77 | #if !HAVE_MEMCPY | |||
|
78 | # define memcpy(d,s,n) bcopy(s,d,n) | |||
|
79 | #endif /* !HAVE_MEMCPY */ | |||
|
80 | #if !HAVE_MEMMOVE | |||
|
81 | # define memmove(d,s,n) bcopy(s,d,n) | |||
|
82 | #endif /* !HAVE_MEMMOVE */ | |||
|
83 | ||||
|
84 | #if !HAVE_MEMSET | |||
|
85 | # define memset _elf_memset | |||
|
86 | extern void *_elf_memset(); | |||
|
87 | #endif /* !HAVE_MEMSET */ | |||
|
88 | ||||
|
89 | #if HAVE_STRUCT_NLIST_DECLARATION | |||
|
90 | # define nlist __override_nlist_declaration | |||
|
91 | #endif /* HAVE_STRUCT_NLIST_DECLARATION */ | |||
|
92 | ||||
|
93 | #if __LIBELF_NEED_LINK_H | |||
|
94 | # include <link.h> | |||
|
95 | #elif __LIBELF_NEED_SYS_LINK_H | |||
|
96 | # include <sys/link.h> | |||
|
97 | #endif /* __LIBELF_NEED_LINK_H */ | |||
|
98 | ||||
|
99 | #if HAVE_AR_H | |||
|
100 | #include <ar.h> | |||
|
101 | #else /* HAVE_AR_H */ | |||
|
102 | ||||
|
103 | #define ARMAG "!<arch>\n" | |||
|
104 | #define SARMAG 8 | |||
|
105 | ||||
|
106 | struct ar_hdr { | |||
|
107 | char ar_name[16]; | |||
|
108 | char ar_date[12]; | |||
|
109 | char ar_uid[6]; | |||
|
110 | char ar_gid[6]; | |||
|
111 | char ar_mode[8]; | |||
|
112 | char ar_size[10]; | |||
|
113 | char ar_fmag[2]; | |||
|
114 | }; | |||
|
115 | ||||
|
116 | #define ARFMAG "`\n" | |||
|
117 | ||||
|
118 | #endif /* HAVE_AR_H */ | |||
|
119 | ||||
|
120 | #include <libelf.h> | |||
|
121 | ||||
|
122 | #if HAVE_STRUCT_NLIST_DECLARATION | |||
|
123 | # undef nlist | |||
|
124 | #endif /* HAVE_STRUCT_NLIST_DECLARATION */ | |||
|
125 | ||||
|
126 | #if __LIBELF64 | |||
|
127 | #include <gelf.h> | |||
|
128 | #endif /* __LIBELF64 */ | |||
|
129 | ||||
|
130 | typedef struct Scn_Data Scn_Data; | |||
|
131 | ||||
|
132 | /* | |||
|
133 | * ELF descriptor | |||
|
134 | */ | |||
|
135 | struct Elf { | |||
|
136 | /* common */ | |||
|
137 | size_t e_size; /* file/member size */ | |||
|
138 | size_t e_dsize; /* size of memory image */ | |||
|
139 | Elf_Kind e_kind; /* kind of file */ | |||
|
140 | char* e_data; /* file/member data */ | |||
|
141 | char* e_rawdata; /* file/member raw data */ | |||
|
142 | size_t e_idlen; /* identifier size */ | |||
|
143 | int e_fd; /* file descriptor */ | |||
|
144 | unsigned e_count; /* activation count */ | |||
|
145 | /* archive members (still common) */ | |||
|
146 | Elf* e_parent; /* NULL if not an archive member */ | |||
|
147 | size_t e_next; /* 0 if not an archive member */ | |||
|
148 | size_t e_base; /* 0 if not an archive member */ | |||
|
149 | Elf* e_link; /* next archive member or NULL */ | |||
|
150 | Elf_Arhdr* e_arhdr; /* archive member header or NULL */ | |||
|
151 | /* archives */ | |||
|
152 | size_t e_off; /* current member offset (for elf_begin) */ | |||
|
153 | Elf* e_members; /* linked list of active archive members */ | |||
|
154 | char* e_symtab; /* archive symbol table */ | |||
|
155 | size_t e_symlen; /* length of archive symbol table */ | |||
|
156 | char* e_strtab; /* archive string table */ | |||
|
157 | size_t e_strlen; /* length of archive string table */ | |||
|
158 | /* ELF files */ | |||
|
159 | unsigned e_class; /* ELF class */ | |||
|
160 | unsigned e_encoding; /* ELF data encoding */ | |||
|
161 | unsigned e_version; /* ELF version */ | |||
|
162 | char* e_ehdr; /* ELF header */ | |||
|
163 | char* e_phdr; /* ELF program header table */ | |||
|
164 | size_t e_phnum; /* size of program header table */ | |||
|
165 | Elf_Scn* e_scn_1; /* first section */ | |||
|
166 | Elf_Scn* e_scn_n; /* last section */ | |||
|
167 | unsigned e_elf_flags; /* elf flags (ELF_F_*) */ | |||
|
168 | unsigned e_ehdr_flags; /* ehdr flags (ELF_F_*) */ | |||
|
169 | unsigned e_phdr_flags; /* phdr flags (ELF_F_*) */ | |||
|
170 | /* misc flags */ | |||
|
171 | unsigned e_readable : 1; /* file is readable */ | |||
|
172 | unsigned e_writable : 1; /* file is writable */ | |||
|
173 | unsigned e_disabled : 1; /* e_fd has been disabled */ | |||
|
174 | unsigned e_cooked : 1; /* e_data was modified */ | |||
|
175 | unsigned e_free_syms : 1; /* e_symtab is malloc'ed */ | |||
|
176 | unsigned e_unmap_data : 1; /* e_data is mmap'ed */ | |||
|
177 | unsigned e_memory : 1; /* created by elf_memory() */ | |||
|
178 | /* magic number for debugging */ | |||
|
179 | long e_magic; | |||
|
180 | }; | |||
|
181 | ||||
|
182 | #define ELF_MAGIC 0x012b649e | |||
|
183 | ||||
|
184 | #define INIT_ELF {\ | |||
|
185 | /* e_size */ 0,\ | |||
|
186 | /* e_dsize */ 0,\ | |||
|
187 | /* e_kind */ ELF_K_NONE,\ | |||
|
188 | /* e_data */ NULL,\ | |||
|
189 | /* e_rawdata */ NULL,\ | |||
|
190 | /* e_idlen */ 0,\ | |||
|
191 | /* e_fd */ -1,\ | |||
|
192 | /* e_count */ 1,\ | |||
|
193 | /* e_parent */ NULL,\ | |||
|
194 | /* e_next */ 0,\ | |||
|
195 | /* e_base */ 0,\ | |||
|
196 | /* e_link */ NULL,\ | |||
|
197 | /* e_arhdr */ NULL,\ | |||
|
198 | /* e_off */ 0,\ | |||
|
199 | /* e_members */ NULL,\ | |||
|
200 | /* e_symtab */ NULL,\ | |||
|
201 | /* e_symlen */ 0,\ | |||
|
202 | /* e_strtab */ NULL,\ | |||
|
203 | /* e_strlen */ 0,\ | |||
|
204 | /* e_class */ ELFCLASSNONE,\ | |||
|
205 | /* e_encoding */ ELFDATANONE,\ | |||
|
206 | /* e_version */ EV_NONE,\ | |||
|
207 | /* e_ehdr */ NULL,\ | |||
|
208 | /* e_phdr */ NULL,\ | |||
|
209 | /* e_phnum */ 0,\ | |||
|
210 | /* e_scn_1 */ NULL,\ | |||
|
211 | /* e_scn_n */ NULL,\ | |||
|
212 | /* e_elf_flags */ 0,\ | |||
|
213 | /* e_ehdr_flags */ 0,\ | |||
|
214 | /* e_phdr_flags */ 0,\ | |||
|
215 | /* e_readable */ 0,\ | |||
|
216 | /* e_writable */ 0,\ | |||
|
217 | /* e_disabled */ 0,\ | |||
|
218 | /* e_cooked */ 0,\ | |||
|
219 | /* e_free_syms */ 0,\ | |||
|
220 | /* e_unmap_data */ 0,\ | |||
|
221 | /* e_memory */ 0,\ | |||
|
222 | /* e_magic */ ELF_MAGIC\ | |||
|
223 | } | |||
|
224 | ||||
|
225 | /* | |||
|
226 | * Section descriptor | |||
|
227 | */ | |||
|
228 | struct Elf_Scn { | |||
|
229 | Elf_Scn* s_link; /* pointer to next Elf_Scn */ | |||
|
230 | Elf* s_elf; /* pointer to elf descriptor */ | |||
|
231 | size_t s_index; /* number of this section */ | |||
|
232 | unsigned s_scn_flags; /* section flags (ELF_F_*) */ | |||
|
233 | unsigned s_shdr_flags; /* shdr flags (ELF_F_*) */ | |||
|
234 | Scn_Data* s_data_1; /* first data buffer */ | |||
|
235 | Scn_Data* s_data_n; /* last data buffer */ | |||
|
236 | Scn_Data* s_rawdata; /* raw data buffer */ | |||
|
237 | /* data copied from shdr */ | |||
|
238 | unsigned s_type; /* section type */ | |||
|
239 | size_t s_offset; /* section offset */ | |||
|
240 | size_t s_size; /* section size */ | |||
|
241 | /* misc flags */ | |||
|
242 | unsigned s_freeme : 1; /* this Elf_Scn was malloc'ed */ | |||
|
243 | /* section header */ | |||
|
244 | union { | |||
|
245 | #if __LIBELF64 | |||
|
246 | Elf64_Shdr u_shdr64; | |||
|
247 | #endif /* __LIBELF64 */ | |||
|
248 | Elf32_Shdr u_shdr32; | |||
|
249 | } s_uhdr; | |||
|
250 | /* magic number for debugging */ | |||
|
251 | long s_magic; | |||
|
252 | }; | |||
|
253 | #define s_shdr32 s_uhdr.u_shdr32 | |||
|
254 | #define s_shdr64 s_uhdr.u_shdr64 | |||
|
255 | ||||
|
256 | #define SCN_MAGIC 0x012c747d | |||
|
257 | ||||
|
258 | #define INIT_SCN {\ | |||
|
259 | /* s_link */ NULL,\ | |||
|
260 | /* s_elf */ NULL,\ | |||
|
261 | /* s_index */ 0,\ | |||
|
262 | /* s_scn_flags */ 0,\ | |||
|
263 | /* s_shdr_flags */ 0,\ | |||
|
264 | /* s_data_1 */ NULL,\ | |||
|
265 | /* s_data_n */ NULL,\ | |||
|
266 | /* s_rawdata */ NULL,\ | |||
|
267 | /* s_type */ SHT_NULL,\ | |||
|
268 | /* s_offset */ 0,\ | |||
|
269 | /* s_size */ 0,\ | |||
|
270 | /* s_freeme */ 0,\ | |||
|
271 | /* s_uhdr */ {{0,}},\ | |||
|
272 | /* s_magic */ SCN_MAGIC\ | |||
|
273 | } | |||
|
274 | ||||
|
275 | /* | |||
|
276 | * Data descriptor | |||
|
277 | */ | |||
|
278 | struct Scn_Data { | |||
|
279 | Elf_Data sd_data; /* must be first! */ | |||
|
280 | Scn_Data* sd_link; /* pointer to next Scn_Data */ | |||
|
281 | Elf_Scn* sd_scn; /* pointer to section */ | |||
|
282 | char* sd_memdata; /* memory image of section */ | |||
|
283 | unsigned sd_data_flags; /* data flags (ELF_F_*) */ | |||
|
284 | /* misc flags */ | |||
|
285 | unsigned sd_freeme : 1; /* this Scn_Data was malloc'ed */ | |||
|
286 | unsigned sd_free_data : 1; /* sd_memdata is malloc'ed */ | |||
|
287 | /* magic number for debugging */ | |||
|
288 | long sd_magic; | |||
|
289 | }; | |||
|
290 | ||||
|
291 | #define DATA_MAGIC 0x01072639 | |||
|
292 | ||||
|
293 | #define INIT_DATA {\ | |||
|
294 | {\ | |||
|
295 | /* d_buf */ NULL,\ | |||
|
296 | /* d_type */ ELF_T_BYTE,\ | |||
|
297 | /* d_size */ 0,\ | |||
|
298 | /* d_off */ 0,\ | |||
|
299 | /* d_align */ 0,\ | |||
|
300 | /* d_version */ EV_NONE\ | |||
|
301 | },\ | |||
|
302 | /* sd_link */ NULL,\ | |||
|
303 | /* sd_scn */ NULL,\ | |||
|
304 | /* sd_memdata */ NULL,\ | |||
|
305 | /* sd_data_flags */ 0,\ | |||
|
306 | /* sd_freeme */ 0,\ | |||
|
307 | /* sd_free_data */ 0,\ | |||
|
308 | /* sd_magic */ DATA_MAGIC\ | |||
|
309 | } | |||
|
310 | ||||
|
311 | /* | |||
|
312 | * Private status variables | |||
|
313 | */ | |||
|
314 | extern unsigned _elf_version; | |||
|
315 | extern int _elf_errno; | |||
|
316 | extern int _elf_fill; | |||
|
317 | extern int _elf_sanity_checks; | |||
|
318 | #define SANITY_CHECK_STRPTR (1u << 0) | |||
|
319 | ||||
|
320 | /* | |||
|
321 | * Private functions | |||
|
322 | */ | |||
|
323 | extern void *_elf_read __P((Elf*, void*, size_t, size_t)); | |||
|
324 | extern void *_elf_mmap __P((Elf*)); | |||
|
325 | extern int _elf_cook __P((Elf*)); | |||
|
326 | extern char *_elf_getehdr __P((Elf*, unsigned)); | |||
|
327 | extern char *_elf_getphdr __P((Elf*, unsigned)); | |||
|
328 | extern Elf_Data *_elf_xlatetom __P((const Elf*, Elf_Data*, const Elf_Data*)); | |||
|
329 | extern Elf_Type _elf_scn_type __P((unsigned)); | |||
|
330 | extern size_t _elf32_xltsize __P((const Elf_Data *__src, unsigned __dv, unsigned __encode, int __tof)); | |||
|
331 | extern size_t _elf64_xltsize __P((const Elf_Data *__src, unsigned __dv, unsigned __encode, int __tof)); | |||
|
332 | extern int _elf_update_shnum(Elf *__elf, size_t __shnum); | |||
|
333 | extern Elf_Scn *_elf_first_scn(Elf *__elf); | |||
|
334 | ||||
|
335 | /* | |||
|
336 | * Special translators | |||
|
337 | */ | |||
|
338 | extern size_t _elf_verdef_32L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
339 | extern size_t _elf_verdef_32L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
340 | extern size_t _elf_verdef_32M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
341 | extern size_t _elf_verdef_32M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
342 | extern size_t _elf_verdef_64L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
343 | extern size_t _elf_verdef_64L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
344 | extern size_t _elf_verdef_64M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
345 | extern size_t _elf_verdef_64M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
346 | extern size_t _elf_verneed_32L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
347 | extern size_t _elf_verneed_32L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
348 | extern size_t _elf_verneed_32M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
349 | extern size_t _elf_verneed_32M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
350 | extern size_t _elf_verneed_64L11_tof __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
351 | extern size_t _elf_verneed_64L11_tom __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
352 | extern size_t _elf_verneed_64M11_tof __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
353 | extern size_t _elf_verneed_64M11_tom __P((unsigned char *dst, const unsigned char *src, size_t n)); | |||
|
354 | ||||
|
355 | /* | |||
|
356 | * Private data | |||
|
357 | */ | |||
|
358 | extern const Elf_Scn _elf_scn_init; | |||
|
359 | extern const Scn_Data _elf_data_init; | |||
|
360 | extern const size_t _elf_fmsize[2][EV_CURRENT - EV_NONE][ELF_T_NUM][2]; | |||
|
361 | ||||
|
362 | /* | |||
|
363 | * Access macros for _elf_fmsize[] | |||
|
364 | */ | |||
|
365 | #define _fmsize(c,v,t,w) \ | |||
|
366 | (_elf_fmsize[(c)-ELFCLASS32][(v)-EV_NONE-1][(t)-ELF_T_BYTE][(w)]) | |||
|
367 | #define _fsize(c,v,t) _fmsize((c),(v),(t),1) | |||
|
368 | #define _msize(c,v,t) _fmsize((c),(v),(t),0) | |||
|
369 | ||||
|
370 | /* | |||
|
371 | * Various checks | |||
|
372 | */ | |||
|
373 | #define valid_class(c) ((c) >= ELFCLASS32 && (c) <= ELFCLASS64) | |||
|
374 | #define valid_encoding(e) ((e) >= ELFDATA2LSB && (e) <= ELFDATA2MSB) | |||
|
375 | #define valid_version(v) ((v) > EV_NONE && (v) <= EV_CURRENT) | |||
|
376 | #define valid_type(t) ((unsigned)(t) < ELF_T_NUM) | |||
|
377 | ||||
|
378 | /* | |||
|
379 | * Error codes | |||
|
380 | */ | |||
|
381 | enum { | |||
|
382 | #define __err__(a,b) a, | |||
|
383 | #include <errors.h> /* include constants from errors.h */ | |||
|
384 | #undef __err__ | |||
|
385 | ERROR_NUM | |||
|
386 | }; | |||
|
387 | ||||
|
388 | #define seterr(err) (_elf_errno = (err)) | |||
|
389 | ||||
|
390 | /* | |||
|
391 | * Sizes of data types (external representation) | |||
|
392 | * These definitions should be in <elf.h>, but... | |||
|
393 | */ | |||
|
394 | #ifndef ELF32_FSZ_ADDR | |||
|
395 | # define ELF32_FSZ_ADDR 4 | |||
|
396 | # define ELF32_FSZ_HALF 2 | |||
|
397 | # define ELF32_FSZ_OFF 4 | |||
|
398 | # define ELF32_FSZ_SWORD 4 | |||
|
399 | # define ELF32_FSZ_WORD 4 | |||
|
400 | #endif /* ELF32_FSZ_ADDR */ | |||
|
401 | #ifndef ELF64_FSZ_ADDR | |||
|
402 | # define ELF64_FSZ_ADDR 8 | |||
|
403 | # define ELF64_FSZ_HALF 2 | |||
|
404 | # define ELF64_FSZ_OFF 8 | |||
|
405 | # define ELF64_FSZ_SWORD 4 | |||
|
406 | # define ELF64_FSZ_SXWORD 8 | |||
|
407 | # define ELF64_FSZ_WORD 4 | |||
|
408 | # define ELF64_FSZ_XWORD 8 | |||
|
409 | #endif /* ELF64_FSZ_ADDR */ | |||
|
410 | ||||
|
411 | /* | |||
|
412 | * More missing pieces, in no particular order | |||
|
413 | */ | |||
|
414 | #ifndef SHT_SYMTAB_SHNDX | |||
|
415 | #define SHT_SYMTAB_SHNDX 18 | |||
|
416 | #endif /* SHT_SYMTAB_SHNDX */ | |||
|
417 | ||||
|
418 | #ifndef SHN_XINDEX | |||
|
419 | #define SHN_XINDEX 0xffff | |||
|
420 | #endif /* SHN_XINDEX */ | |||
|
421 | ||||
|
422 | #ifndef PN_XNUM | |||
|
423 | #define PN_XNUM 0xffff | |||
|
424 | #endif /* PN_XNUM */ | |||
|
425 | ||||
|
426 | /* | |||
|
427 | * Debugging | |||
|
428 | */ | |||
|
429 | #if ENABLE_DEBUG | |||
|
430 | extern void __elf_assert __P((const char*, unsigned, const char*)); | |||
|
431 | # if (__STDC__ + 0) | |||
|
432 | # define elf_assert(x) do{if(!(x))__elf_assert(__FILE__,__LINE__,#x);}while(0) | |||
|
433 | # else /* __STDC__ */ | |||
|
434 | # define elf_assert(x) do{if(!(x))__elf_assert(__FILE__,__LINE__,"x");}while(0) | |||
|
435 | # endif /* __STDC__ */ | |||
|
436 | #else /* ENABLE_DEBUG */ | |||
|
437 | # define elf_assert(x) do{}while(0) | |||
|
438 | #endif /* ENABLE_DEBUG */ | |||
|
439 | ||||
|
440 | /* | |||
|
441 | * Return values for certain functions | |||
|
442 | */ | |||
|
443 | #define LIBELF_SUCCESS 1 | |||
|
444 | #define LIBELF_FAILURE 0 | |||
|
445 | ||||
|
446 | #endif /* _PRIVATE_H */ |
@@ -0,0 +1,131 | |||||
|
1 | /* lib/sys_elf.h. Generated automatically by configure. */ | |||
|
2 | /* | |||
|
3 | sys_elf.h.in - configure template for private "switch" file. | |||
|
4 | Copyright (C) 1998 - 2001 Michael Riepe | |||
|
5 | ||||
|
6 | This library is free software; you can redistribute it and/or | |||
|
7 | modify it under the terms of the GNU Library General Public | |||
|
8 | License as published by the Free Software Foundation; either | |||
|
9 | version 2 of the License, or (at your option) any later version. | |||
|
10 | ||||
|
11 | This library is distributed in the hope that it will be useful, | |||
|
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
14 | Library General Public License for more details. | |||
|
15 | ||||
|
16 | You should have received a copy of the GNU Library General Public | |||
|
17 | License along with this library; if not, write to the Free Software | |||
|
18 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
19 | */ | |||
|
20 | ||||
|
21 | /* @(#) $Id: sys_elf.h.in,v 1.13 2008/05/23 08:57:07 michael Exp $ */ | |||
|
22 | ||||
|
23 | /* | |||
|
24 | * DO NOT USE THIS IN APPLICATIONS - #include <libelf.h> INSTEAD! | |||
|
25 | */ | |||
|
26 | ||||
|
27 | /* Define to `<elf.h>' or `<sys/elf.h>' if one of them is present */ | |||
|
28 | /* #undef __LIBELF_HEADER_ELF_H */ | |||
|
29 | ||||
|
30 | /* Define if Elf32_Dyn is declared in <link.h> */ | |||
|
31 | /* #undef __LIBELF_NEED_LINK_H */ | |||
|
32 | ||||
|
33 | /* Define if Elf32_Dyn is declared in <sys/link.h> */ | |||
|
34 | /* #undef __LIBELF_NEED_SYS_LINK_H */ | |||
|
35 | ||||
|
36 | /* Define if you want 64-bit support (and your system supports it) */ | |||
|
37 | #define __LIBELF64 1 | |||
|
38 | ||||
|
39 | /* Define if you want 64-bit support, and are running IRIX */ | |||
|
40 | /* #undef __LIBELF64_IRIX */ | |||
|
41 | ||||
|
42 | /* Define if you want 64-bit support, and are running Linux */ | |||
|
43 | /* #undef __LIBELF64_LINUX */ | |||
|
44 | ||||
|
45 | /* Define if you want symbol versioning (and your system supports it) */ | |||
|
46 | #define __LIBELF_SYMBOL_VERSIONS 1 | |||
|
47 | ||||
|
48 | /* Define to a 64-bit signed integer type if one exists */ | |||
|
49 | #define __libelf_i64_t __int64 | |||
|
50 | ||||
|
51 | /* Define to a 64-bit unsigned integer type if one exists */ | |||
|
52 | #define __libelf_u64_t unsigned __int64 | |||
|
53 | ||||
|
54 | /* Define to a 32-bit signed integer type if one exists */ | |||
|
55 | #define __libelf_i32_t int | |||
|
56 | ||||
|
57 | /* Define to a 32-bit unsigned integer type if one exists */ | |||
|
58 | #define __libelf_u32_t unsigned int | |||
|
59 | ||||
|
60 | /* Define to a 16-bit signed integer type if one exists */ | |||
|
61 | #define __libelf_i16_t short | |||
|
62 | ||||
|
63 | /* Define to a 16-bit unsigned integer type if one exists */ | |||
|
64 | #define __libelf_u16_t unsigned short | |||
|
65 | ||||
|
66 | /* | |||
|
67 | * Ok, now get the correct instance of elf.h... | |||
|
68 | */ | |||
|
69 | #ifdef __LIBELF_HEADER_ELF_H | |||
|
70 | # include __LIBELF_HEADER_ELF_H | |||
|
71 | #else /* __LIBELF_HEADER_ELF_H */ | |||
|
72 | # if __LIBELF_INTERNAL__ | |||
|
73 | # include <elf_repl.h> | |||
|
74 | # else /* __LIBELF_INTERNAL__ */ | |||
|
75 | # include <libelf/elf_repl.h> | |||
|
76 | # endif /* __LIBELF_INTERNAL__ */ | |||
|
77 | #endif /* __LIBELF_HEADER_ELF_H */ | |||
|
78 | ||||
|
79 | /* | |||
|
80 | * On some systems, <elf.h> is severely broken. Try to fix it. | |||
|
81 | */ | |||
|
82 | #ifdef __LIBELF_HEADER_ELF_H | |||
|
83 | ||||
|
84 | # ifndef ELF32_FSZ_ADDR | |||
|
85 | # define ELF32_FSZ_ADDR 4 | |||
|
86 | # define ELF32_FSZ_HALF 2 | |||
|
87 | # define ELF32_FSZ_OFF 4 | |||
|
88 | # define ELF32_FSZ_SWORD 4 | |||
|
89 | # define ELF32_FSZ_WORD 4 | |||
|
90 | # endif /* ELF32_FSZ_ADDR */ | |||
|
91 | ||||
|
92 | # ifndef STN_UNDEF | |||
|
93 | # define STN_UNDEF 0 | |||
|
94 | # endif /* STN_UNDEF */ | |||
|
95 | ||||
|
96 | # if __LIBELF64 | |||
|
97 | ||||
|
98 | # ifndef ELF64_FSZ_ADDR | |||
|
99 | # define ELF64_FSZ_ADDR 8 | |||
|
100 | # define ELF64_FSZ_HALF 2 | |||
|
101 | # define ELF64_FSZ_OFF 8 | |||
|
102 | # define ELF64_FSZ_SWORD 4 | |||
|
103 | # define ELF64_FSZ_WORD 4 | |||
|
104 | # define ELF64_FSZ_SXWORD 8 | |||
|
105 | # define ELF64_FSZ_XWORD 8 | |||
|
106 | # endif /* ELF64_FSZ_ADDR */ | |||
|
107 | ||||
|
108 | # ifndef ELF64_ST_BIND | |||
|
109 | # define ELF64_ST_BIND(i) ((i)>>4) | |||
|
110 | # define ELF64_ST_TYPE(i) ((i)&0xf) | |||
|
111 | # define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf)) | |||
|
112 | # endif /* ELF64_ST_BIND */ | |||
|
113 | ||||
|
114 | # ifndef ELF64_R_SYM | |||
|
115 | # define ELF64_R_SYM(i) ((Elf64_Xword)(i)>>32) | |||
|
116 | # define ELF64_R_TYPE(i) ((i)&0xffffffffL) | |||
|
117 | # define ELF64_R_INFO(s,t) (((Elf64_Xword)(s)<<32)+((t)&0xffffffffL)) | |||
|
118 | # endif /* ELF64_R_SYM */ | |||
|
119 | ||||
|
120 | # if __LIBELF64_LINUX | |||
|
121 | typedef __libelf_u64_t Elf64_Addr; | |||
|
122 | typedef __libelf_u16_t Elf64_Half; | |||
|
123 | typedef __libelf_u64_t Elf64_Off; | |||
|
124 | typedef __libelf_i32_t Elf64_Sword; | |||
|
125 | typedef __libelf_u32_t Elf64_Word; | |||
|
126 | typedef __libelf_i64_t Elf64_Sxword; | |||
|
127 | typedef __libelf_u64_t Elf64_Xword; | |||
|
128 | # endif /* __LIBELF64_LINUX */ | |||
|
129 | ||||
|
130 | # endif /* __LIBELF64 */ | |||
|
131 | #endif /* __LIBELF_HEADER_ELF_H */ |
@@ -0,0 +1,241 | |||||
|
1 | /* | |||
|
2 | * verdef.h - copy versioning information. | |||
|
3 | * Copyright (C) 2001 - 2006 Michael Riepe | |||
|
4 | * | |||
|
5 | * This library is free software; you can redistribute it and/or | |||
|
6 | * modify it under the terms of the GNU Library General Public | |||
|
7 | * License as published by the Free Software Foundation; either | |||
|
8 | * version 2 of the License, or (at your option) any later version. | |||
|
9 | * | |||
|
10 | * This library is distributed in the hope that it will be useful, | |||
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | * Library General Public License for more details. | |||
|
14 | * | |||
|
15 | * You should have received a copy of the GNU Library General Public | |||
|
16 | * License along with this library; if not, write to the Free Software | |||
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | #ifndef lint | |||
|
21 | static const char verdef_h_rcsid[] = "@(#) $Id: verdef.h,v 1.13 2008/05/23 08:15:35 michael Exp $"; | |||
|
22 | #endif /* lint */ | |||
|
23 | ||||
|
24 | #if VER_DEF_CURRENT != 1 | |||
|
25 | #error libelf currently does not support VER_DEF_CURRENT != 1 | |||
|
26 | #endif /* VER_DEF_CURRENT != 1 */ | |||
|
27 | ||||
|
28 | #if TOFILE | |||
|
29 | ||||
|
30 | static void | |||
|
31 | __store_verdaux(verdaux_ftype *dst, const verdaux_mtype *src, unsigned enc) { | |||
|
32 | if (enc == ELFDATA2LSB) { | |||
|
33 | __store_u32L(dst->vda_name, src->vda_name); | |||
|
34 | __store_u32L(dst->vda_next, src->vda_next); | |||
|
35 | } | |||
|
36 | else { | |||
|
37 | __store_u32M(dst->vda_name, src->vda_name); | |||
|
38 | __store_u32M(dst->vda_next, src->vda_next); | |||
|
39 | } | |||
|
40 | } | |||
|
41 | ||||
|
42 | static void | |||
|
43 | __store_verdef(verdef_ftype *dst, const verdef_mtype *src, unsigned enc) { | |||
|
44 | if (enc == ELFDATA2LSB) { | |||
|
45 | __store_u16L(dst->vd_version, src->vd_version); | |||
|
46 | __store_u16L(dst->vd_flags, src->vd_flags); | |||
|
47 | __store_u16L(dst->vd_ndx, src->vd_ndx); | |||
|
48 | __store_u16L(dst->vd_cnt, src->vd_cnt); | |||
|
49 | __store_u32L(dst->vd_hash, src->vd_hash); | |||
|
50 | __store_u32L(dst->vd_aux, src->vd_aux); | |||
|
51 | __store_u32L(dst->vd_next, src->vd_next); | |||
|
52 | } | |||
|
53 | else { | |||
|
54 | __store_u16M(dst->vd_version, src->vd_version); | |||
|
55 | __store_u16M(dst->vd_flags, src->vd_flags); | |||
|
56 | __store_u16M(dst->vd_ndx, src->vd_ndx); | |||
|
57 | __store_u16M(dst->vd_cnt, src->vd_cnt); | |||
|
58 | __store_u32M(dst->vd_hash, src->vd_hash); | |||
|
59 | __store_u32M(dst->vd_aux, src->vd_aux); | |||
|
60 | __store_u32M(dst->vd_next, src->vd_next); | |||
|
61 | } | |||
|
62 | } | |||
|
63 | ||||
|
64 | typedef verdaux_mtype verdaux_stype; | |||
|
65 | typedef verdaux_ftype verdaux_dtype; | |||
|
66 | typedef verdef_mtype verdef_stype; | |||
|
67 | typedef verdef_ftype verdef_dtype; | |||
|
68 | typedef align_mtype verdef_atype; | |||
|
69 | ||||
|
70 | #define copy_verdaux_srctotmp(d, s, e) (*(d) = *(s)) | |||
|
71 | #define copy_verdaux_tmptodst(d, s, e) __store_verdaux((d), (s), (e)) | |||
|
72 | #define copy_verdef_srctotmp(d, s, e) (*(d) = *(s)) | |||
|
73 | #define copy_verdef_tmptodst(d, s, e) __store_verdef((d), (s), (e)) | |||
|
74 | ||||
|
75 | #define translator_suffix _tof | |||
|
76 | ||||
|
77 | #else /* TOFILE */ | |||
|
78 | ||||
|
79 | static void | |||
|
80 | __load_verdaux(verdaux_mtype *dst, const verdaux_ftype *src, unsigned enc) { | |||
|
81 | if (enc == ELFDATA2LSB) { | |||
|
82 | dst->vda_name = __load_u32L(src->vda_name); | |||
|
83 | dst->vda_next = __load_u32L(src->vda_next); | |||
|
84 | } | |||
|
85 | else { | |||
|
86 | dst->vda_name = __load_u32M(src->vda_name); | |||
|
87 | dst->vda_next = __load_u32M(src->vda_next); | |||
|
88 | } | |||
|
89 | } | |||
|
90 | ||||
|
91 | static void | |||
|
92 | __load_verdef(verdef_mtype *dst, const verdef_ftype *src, unsigned enc) { | |||
|
93 | if (enc == ELFDATA2LSB) { | |||
|
94 | dst->vd_version = __load_u16L(src->vd_version); | |||
|
95 | dst->vd_flags = __load_u16L(src->vd_flags); | |||
|
96 | dst->vd_ndx = __load_u16L(src->vd_ndx); | |||
|
97 | dst->vd_cnt = __load_u16L(src->vd_cnt); | |||
|
98 | dst->vd_hash = __load_u32L(src->vd_hash); | |||
|
99 | dst->vd_aux = __load_u32L(src->vd_aux); | |||
|
100 | dst->vd_next = __load_u32L(src->vd_next); | |||
|
101 | } | |||
|
102 | else { | |||
|
103 | dst->vd_version = __load_u16M(src->vd_version); | |||
|
104 | dst->vd_flags = __load_u16M(src->vd_flags); | |||
|
105 | dst->vd_ndx = __load_u16M(src->vd_ndx); | |||
|
106 | dst->vd_cnt = __load_u16M(src->vd_cnt); | |||
|
107 | dst->vd_hash = __load_u32M(src->vd_hash); | |||
|
108 | dst->vd_aux = __load_u32M(src->vd_aux); | |||
|
109 | dst->vd_next = __load_u32M(src->vd_next); | |||
|
110 | } | |||
|
111 | } | |||
|
112 | ||||
|
113 | typedef verdaux_ftype verdaux_stype; | |||
|
114 | typedef verdaux_mtype verdaux_dtype; | |||
|
115 | typedef verdef_ftype verdef_stype; | |||
|
116 | typedef verdef_mtype verdef_dtype; | |||
|
117 | typedef align_ftype verdef_atype; | |||
|
118 | ||||
|
119 | #define copy_verdaux_srctotmp(d, s, e) __load_verdaux((d), (s), (e)) | |||
|
120 | #define copy_verdaux_tmptodst(d, s, e) (*(d) = *(s)) | |||
|
121 | #define copy_verdef_srctotmp(d, s, e) __load_verdef((d), (s), (e)) | |||
|
122 | #define copy_verdef_tmptodst(d, s, e) (*(d) = *(s)) | |||
|
123 | ||||
|
124 | #define translator_suffix _tom | |||
|
125 | ||||
|
126 | #endif /* TOFILE */ | |||
|
127 | ||||
|
128 | #define cat3(a,b,c) a##b##c | |||
|
129 | #define xlt3(p,e,s) cat3(p,e,s) | |||
|
130 | #define xltprefix(x) xlt3(x,_,class_suffix) | |||
|
131 | #define translator(x,e) xlt3(xltprefix(_elf_##x),e,translator_suffix) | |||
|
132 | ||||
|
133 | static size_t | |||
|
134 | xlt_verdef(unsigned char *dst, const unsigned char *src, size_t n, unsigned enc) { | |||
|
135 | size_t off; | |||
|
136 | ||||
|
137 | if (sizeof(verdef_stype) != sizeof(verdef_dtype) | |||
|
138 | || sizeof(verdaux_stype) != sizeof(verdaux_dtype)) { | |||
|
139 | /* never happens for ELF v1 and Verneed v1 */ | |||
|
140 | seterr(ERROR_UNIMPLEMENTED); | |||
|
141 | return (size_t)-1; | |||
|
142 | } | |||
|
143 | /* size translation shortcut */ | |||
|
144 | if (dst == NULL) { | |||
|
145 | return n; | |||
|
146 | } | |||
|
147 | if (src == NULL) { | |||
|
148 | seterr(ERROR_NULLBUF); | |||
|
149 | return (size_t)-1; | |||
|
150 | } | |||
|
151 | off = 0; | |||
|
152 | while (off + sizeof(verdef_stype) <= n) { | |||
|
153 | const verdef_stype *svd; | |||
|
154 | verdef_dtype *dvd; | |||
|
155 | verdef_mtype vd; | |||
|
156 | size_t acount; | |||
|
157 | size_t aoff; | |||
|
158 | ||||
|
159 | /* | |||
|
160 | * check for proper alignment | |||
|
161 | */ | |||
|
162 | if (off % sizeof(verdef_atype)) { | |||
|
163 | seterr(ERROR_VERDEF_FORMAT); | |||
|
164 | return (size_t)-1; | |||
|
165 | } | |||
|
166 | /* | |||
|
167 | * copy and check src | |||
|
168 | */ | |||
|
169 | svd = (verdef_stype*)(src + off); | |||
|
170 | dvd = (verdef_dtype*)(dst + off); | |||
|
171 | copy_verdef_srctotmp(&vd, svd, enc); | |||
|
172 | if (vd.vd_version < 1 | |||
|
173 | || vd.vd_version > VER_DEF_CURRENT) { | |||
|
174 | seterr(ERROR_VERDEF_VERSION); | |||
|
175 | return (size_t)-1; | |||
|
176 | } | |||
|
177 | if (vd.vd_cnt < 1 | |||
|
178 | || vd.vd_aux == 0) { | |||
|
179 | seterr(ERROR_VERDEF_FORMAT); | |||
|
180 | return (size_t)-1; | |||
|
181 | } | |||
|
182 | copy_verdef_tmptodst(dvd, &vd, enc); | |||
|
183 | /* | |||
|
184 | * copy aux array | |||
|
185 | */ | |||
|
186 | aoff = off + vd.vd_aux; | |||
|
187 | for (acount = 0; acount < vd.vd_cnt; acount++) { | |||
|
188 | const verdaux_stype *svda; | |||
|
189 | verdaux_dtype *dvda; | |||
|
190 | verdaux_mtype vda; | |||
|
191 | ||||
|
192 | /* | |||
|
193 | * are we still inside the buffer limits? | |||
|
194 | */ | |||
|
195 | if (aoff + sizeof(verdaux_stype) > n) { | |||
|
196 | break; | |||
|
197 | } | |||
|
198 | /* | |||
|
199 | * check for proper alignment | |||
|
200 | */ | |||
|
201 | if (aoff % sizeof(verdef_atype)) { | |||
|
202 | seterr(ERROR_VERDEF_FORMAT); | |||
|
203 | return (size_t)-1; | |||
|
204 | } | |||
|
205 | /* | |||
|
206 | * copy and check src | |||
|
207 | */ | |||
|
208 | svda = (verdaux_stype*)(src + aoff); | |||
|
209 | dvda = (verdaux_dtype*)(dst + aoff); | |||
|
210 | copy_verdaux_srctotmp(&vda, svda, enc); | |||
|
211 | copy_verdaux_tmptodst(dvda, &vda, enc); | |||
|
212 | /* | |||
|
213 | * advance to next verdaux | |||
|
214 | */ | |||
|
215 | if (vda.vda_next == 0) { | |||
|
216 | /* end of list */ | |||
|
217 | break; | |||
|
218 | } | |||
|
219 | aoff += vda.vda_next; | |||
|
220 | } | |||
|
221 | /* | |||
|
222 | * advance to next verdef | |||
|
223 | */ | |||
|
224 | if (vd.vd_next == 0) { | |||
|
225 | /* end of list */ | |||
|
226 | break; | |||
|
227 | } | |||
|
228 | off += vd.vd_next; | |||
|
229 | } | |||
|
230 | return n; | |||
|
231 | } | |||
|
232 | ||||
|
233 | size_t | |||
|
234 | translator(verdef,L11)(unsigned char *dst, const unsigned char *src, size_t n) { | |||
|
235 | return xlt_verdef(dst, src, n, ELFDATA2LSB); | |||
|
236 | } | |||
|
237 | ||||
|
238 | size_t | |||
|
239 | translator(verdef,M11)(unsigned char *dst, const unsigned char *src, size_t n) { | |||
|
240 | return xlt_verdef(dst, src, n, ELFDATA2MSB); | |||
|
241 | } |
@@ -0,0 +1,245 | |||||
|
1 | /* | |||
|
2 | * verneed.h - copy versioning information. | |||
|
3 | * Copyright (C) 2001 - 2006 Michael Riepe | |||
|
4 | * | |||
|
5 | * This library is free software; you can redistribute it and/or | |||
|
6 | * modify it under the terms of the GNU Library General Public | |||
|
7 | * License as published by the Free Software Foundation; either | |||
|
8 | * version 2 of the License, or (at your option) any later version. | |||
|
9 | * | |||
|
10 | * This library is distributed in the hope that it will be useful, | |||
|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
|
13 | * Library General Public License for more details. | |||
|
14 | * | |||
|
15 | * You should have received a copy of the GNU Library General Public | |||
|
16 | * License along with this library; if not, write to the Free Software | |||
|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA | |||
|
18 | */ | |||
|
19 | ||||
|
20 | #ifndef lint | |||
|
21 | static const char verneed_h_rcsid[] = "@(#) $Id: verneed.h,v 1.13 2008/05/23 08:15:35 michael Exp $"; | |||
|
22 | #endif /* lint */ | |||
|
23 | ||||
|
24 | #if VER_NEED_CURRENT != 1 | |||
|
25 | #error libelf currently does not support VER_NEED_CURRENT != 1 | |||
|
26 | #endif /* VER_NEED_CURRENT != 1 */ | |||
|
27 | ||||
|
28 | #if TOFILE | |||
|
29 | ||||
|
30 | static void | |||
|
31 | __store_vernaux(vernaux_ftype *dst, const vernaux_mtype *src, unsigned enc) { | |||
|
32 | if (enc == ELFDATA2LSB) { | |||
|
33 | __store_u32L(dst->vna_hash, src->vna_hash); | |||
|
34 | __store_u16L(dst->vna_flags, src->vna_flags); | |||
|
35 | __store_u16L(dst->vna_other, src->vna_other); | |||
|
36 | __store_u32L(dst->vna_name, src->vna_name); | |||
|
37 | __store_u32L(dst->vna_next, src->vna_next); | |||
|
38 | } | |||
|
39 | else { | |||
|
40 | __store_u32M(dst->vna_hash, src->vna_hash); | |||
|
41 | __store_u16M(dst->vna_flags, src->vna_flags); | |||
|
42 | __store_u16M(dst->vna_other, src->vna_other); | |||
|
43 | __store_u32M(dst->vna_name, src->vna_name); | |||
|
44 | __store_u32M(dst->vna_next, src->vna_next); | |||
|
45 | } | |||
|
46 | } | |||
|
47 | ||||
|
48 | static void | |||
|
49 | __store_verneed(verneed_ftype *dst, const verneed_mtype *src, unsigned enc) { | |||
|
50 | if (enc == ELFDATA2LSB) { | |||
|
51 | __store_u16L(dst->vn_version, src->vn_version); | |||
|
52 | __store_u16L(dst->vn_cnt, src->vn_cnt); | |||
|
53 | __store_u32L(dst->vn_file, src->vn_file); | |||
|
54 | __store_u32L(dst->vn_aux, src->vn_aux); | |||
|
55 | __store_u32L(dst->vn_next, src->vn_next); | |||
|
56 | } | |||
|
57 | else { | |||
|
58 | __store_u16M(dst->vn_version, src->vn_version); | |||
|
59 | __store_u16M(dst->vn_cnt, src->vn_cnt); | |||
|
60 | __store_u32M(dst->vn_file, src->vn_file); | |||
|
61 | __store_u32M(dst->vn_aux, src->vn_aux); | |||
|
62 | __store_u32M(dst->vn_next, src->vn_next); | |||
|
63 | } | |||
|
64 | } | |||
|
65 | ||||
|
66 | typedef vernaux_mtype vernaux_stype; | |||
|
67 | typedef vernaux_ftype vernaux_dtype; | |||
|
68 | typedef verneed_mtype verneed_stype; | |||
|
69 | typedef verneed_ftype verneed_dtype; | |||
|
70 | typedef align_mtype verneed_atype; | |||
|
71 | ||||
|
72 | #define copy_vernaux_srctotmp(d, s, e) (*(d) = *(s)) | |||
|
73 | #define copy_vernaux_tmptodst(d, s, e) __store_vernaux((d), (s), (e)) | |||
|
74 | #define copy_verneed_srctotmp(d, s, e) (*(d) = *(s)) | |||
|
75 | #define copy_verneed_tmptodst(d, s, e) __store_verneed((d), (s), (e)) | |||
|
76 | ||||
|
77 | #define translator_suffix _tof | |||
|
78 | ||||
|
79 | #else /* TOFILE */ | |||
|
80 | ||||
|
81 | static void | |||
|
82 | __load_vernaux(vernaux_mtype *dst, const vernaux_ftype *src, unsigned enc) { | |||
|
83 | if (enc == ELFDATA2LSB) { | |||
|
84 | dst->vna_hash = __load_u32L(src->vna_hash); | |||
|
85 | dst->vna_flags = __load_u16L(src->vna_flags); | |||
|
86 | dst->vna_other = __load_u16L(src->vna_other); | |||
|
87 | dst->vna_name = __load_u32L(src->vna_name); | |||
|
88 | dst->vna_next = __load_u32L(src->vna_next); | |||
|
89 | } | |||
|
90 | else { | |||
|
91 | dst->vna_hash = __load_u32M(src->vna_hash); | |||
|
92 | dst->vna_flags = __load_u16M(src->vna_flags); | |||
|
93 | dst->vna_other = __load_u16M(src->vna_other); | |||
|
94 | dst->vna_name = __load_u32M(src->vna_name); | |||
|
95 | dst->vna_next = __load_u32M(src->vna_next); | |||
|
96 | } | |||
|
97 | } | |||
|
98 | ||||
|
99 | static void | |||
|
100 | __load_verneed(verneed_mtype *dst, const verneed_ftype *src, unsigned enc) { | |||
|
101 | if (enc == ELFDATA2LSB) { | |||
|
102 | dst->vn_version = __load_u16L(src->vn_version); | |||
|
103 | dst->vn_cnt = __load_u16L(src->vn_cnt); | |||
|
104 | dst->vn_file = __load_u32L(src->vn_file); | |||
|
105 | dst->vn_aux = __load_u32L(src->vn_aux); | |||
|
106 | dst->vn_next = __load_u32L(src->vn_next); | |||
|
107 | } | |||
|
108 | else { | |||
|
109 | dst->vn_version = __load_u16M(src->vn_version); | |||
|
110 | dst->vn_cnt = __load_u16M(src->vn_cnt); | |||
|
111 | dst->vn_file = __load_u32M(src->vn_file); | |||
|
112 | dst->vn_aux = __load_u32M(src->vn_aux); | |||
|
113 | dst->vn_next = __load_u32M(src->vn_next); | |||
|
114 | } | |||
|
115 | } | |||
|
116 | ||||
|
117 | typedef vernaux_ftype vernaux_stype; | |||
|
118 | typedef vernaux_mtype vernaux_dtype; | |||
|
119 | typedef verneed_ftype verneed_stype; | |||
|
120 | typedef verneed_mtype verneed_dtype; | |||
|
121 | typedef align_ftype verneed_atype; | |||
|
122 | ||||
|
123 | #define copy_vernaux_srctotmp(d, s, e) __load_vernaux((d), (s), (e)) | |||
|
124 | #define copy_vernaux_tmptodst(d, s, e) (*(d) = *(s)) | |||
|
125 | #define copy_verneed_srctotmp(d, s, e) __load_verneed((d), (s), (e)) | |||
|
126 | #define copy_verneed_tmptodst(d, s, e) (*(d) = *(s)) | |||
|
127 | ||||
|
128 | #define translator_suffix _tom | |||
|
129 | ||||
|
130 | #endif /* TOFILE */ | |||
|
131 | ||||
|
132 | #define cat3(a,b,c) a##b##c | |||
|
133 | #define xlt3(p,e,s) cat3(p,e,s) | |||
|
134 | #define xltprefix(x) xlt3(x,_,class_suffix) | |||
|
135 | #define translator(x,e) xlt3(xltprefix(_elf_##x),e,translator_suffix) | |||
|
136 | ||||
|
137 | static size_t | |||
|
138 | xlt_verneed(unsigned char *dst, const unsigned char *src, size_t n, unsigned enc) { | |||
|
139 | size_t off; | |||
|
140 | ||||
|
141 | if (sizeof(verneed_stype) != sizeof(verneed_dtype) | |||
|
142 | || sizeof(vernaux_stype) != sizeof(vernaux_dtype)) { | |||
|
143 | /* never happens for ELF v1 and Verneed v1 */ | |||
|
144 | seterr(ERROR_UNIMPLEMENTED); | |||
|
145 | return (size_t)-1; | |||
|
146 | } | |||
|
147 | /* size translation shortcut */ | |||
|
148 | if (dst == NULL) { | |||
|
149 | return n; | |||
|
150 | } | |||
|
151 | if (src == NULL) { | |||
|
152 | seterr(ERROR_NULLBUF); | |||
|
153 | return (size_t)-1; | |||
|
154 | } | |||
|
155 | off = 0; | |||
|
156 | while (off + sizeof(verneed_stype) <= n) { | |||
|
157 | const verneed_stype *svn; | |||
|
158 | verneed_dtype *dvn; | |||
|
159 | verneed_mtype vn; | |||
|
160 | size_t acount; | |||
|
161 | size_t aoff; | |||
|
162 | ||||
|
163 | /* | |||
|
164 | * check for proper alignment | |||
|
165 | */ | |||
|
166 | if (off % sizeof(verneed_atype)) { | |||
|
167 | seterr(ERROR_VERNEED_FORMAT); | |||
|
168 | return (size_t)-1; | |||
|
169 | } | |||
|
170 | /* | |||
|
171 | * copy and check src | |||
|
172 | */ | |||
|
173 | svn = (verneed_stype*)(src + off); | |||
|
174 | dvn = (verneed_dtype*)(dst + off); | |||
|
175 | copy_verneed_srctotmp(&vn, svn, enc); | |||
|
176 | if (vn.vn_version < 1 | |||
|
177 | || vn.vn_version > VER_NEED_CURRENT) { | |||
|
178 | seterr(ERROR_VERNEED_VERSION); | |||
|
179 | return (size_t)-1; | |||
|
180 | } | |||
|
181 | if (vn.vn_cnt < 1 | |||
|
182 | || vn.vn_aux == 0) { | |||
|
183 | seterr(ERROR_VERNEED_FORMAT); | |||
|
184 | return (size_t)-1; | |||
|
185 | } | |||
|
186 | copy_verneed_tmptodst(dvn, &vn, enc); | |||
|
187 | /* | |||
|
188 | * copy aux array | |||
|
189 | */ | |||
|
190 | aoff = off + vn.vn_aux; | |||
|
191 | for (acount = 0; acount < vn.vn_cnt; acount++) { | |||
|
192 | const vernaux_stype *svna; | |||
|
193 | vernaux_dtype *dvna; | |||
|
194 | vernaux_mtype vna; | |||
|
195 | ||||
|
196 | /* | |||
|
197 | * are we still inside the buffer limits? | |||
|
198 | */ | |||
|
199 | if (aoff + sizeof(vernaux_stype) > n) { | |||
|
200 | break; | |||
|
201 | } | |||
|
202 | /* | |||
|
203 | * check for proper alignment | |||
|
204 | */ | |||
|
205 | if (aoff % sizeof(verneed_atype)) { | |||
|
206 | seterr(ERROR_VERNEED_FORMAT); | |||
|
207 | return (size_t)-1; | |||
|
208 | } | |||
|
209 | /* | |||
|
210 | * copy and check src | |||
|
211 | */ | |||
|
212 | svna = (vernaux_stype*)(src + aoff); | |||
|
213 | dvna = (vernaux_dtype*)(dst + aoff); | |||
|
214 | copy_vernaux_srctotmp(&vna, svna, enc); | |||
|
215 | copy_vernaux_tmptodst(dvna, &vna, enc); | |||
|
216 | /* | |||
|
217 | * advance to next vernaux | |||
|
218 | */ | |||
|
219 | if (vna.vna_next == 0) { | |||
|
220 | /* end of list */ | |||
|
221 | break; | |||
|
222 | } | |||
|
223 | aoff += vna.vna_next; | |||
|
224 | } | |||
|
225 | /* | |||
|
226 | * advance to next verneed | |||
|
227 | */ | |||
|
228 | if (vn.vn_next == 0) { | |||
|
229 | /* end of list */ | |||
|
230 | break; | |||
|
231 | } | |||
|
232 | off += vn.vn_next; | |||
|
233 | } | |||
|
234 | return n; | |||
|
235 | } | |||
|
236 | ||||
|
237 | size_t | |||
|
238 | translator(verneed,L11)(unsigned char *dst, const unsigned char *src, size_t n) { | |||
|
239 | return xlt_verneed(dst, src, n, ELFDATA2LSB); | |||
|
240 | } | |||
|
241 | ||||
|
242 | size_t | |||
|
243 | translator(verneed,M11)(unsigned char *dst, const unsigned char *src, size_t n) { | |||
|
244 | return xlt_verneed(dst, src, n, ELFDATA2MSB); | |||
|
245 | } |
@@ -0,0 +1,62 | |||||
|
1 | #include "genericbinaryfilewidget.h" | |||
|
2 | #include "ui_genericbinaryfilewidget.h" | |||
|
3 | #include <QFileDialog> | |||
|
4 | #include <QFile> | |||
|
5 | #include "srec/srecfile.h" | |||
|
6 | ||||
|
7 | genericBinaryFileWidget::genericBinaryFileWidget(QWidget *parent) : | |||
|
8 | QWidget(parent), | |||
|
9 | ui(new Ui::genericBinaryFileWidget) | |||
|
10 | { | |||
|
11 | ui->setupUi(this); | |||
|
12 | } | |||
|
13 | ||||
|
14 | genericBinaryFileWidget::~genericBinaryFileWidget() | |||
|
15 | { | |||
|
16 | delete ui; | |||
|
17 | } | |||
|
18 | ||||
|
19 | void genericBinaryFileWidget::openFile() | |||
|
20 | { | |||
|
21 | QStringList filesNames = QFileDialog::getOpenFileNames( | |||
|
22 | this, | |||
|
23 | "Select one or more files to open", | |||
|
24 | NULL, | |||
|
25 | "Binary Files (*.bin);;SREC Files (*.srec);;Elf Files (*)"); | |||
|
26 | ||||
|
27 | for(int i=0;i<filesNames.count();i++) | |||
|
28 | { | |||
|
29 | QFile file(filesNames.at(i)); | |||
|
30 | if(file.open(QIODevice::ReadOnly)) | |||
|
31 | { | |||
|
32 | char magic[4]; | |||
|
33 | file.read(magic,4); | |||
|
34 | QString line; | |||
|
35 | switch((int)magic[0]) | |||
|
36 | { | |||
|
37 | case 'e': | |||
|
38 | if((magic[1]=='l') && (magic[2]=='f')) | |||
|
39 | { | |||
|
40 | files.append(new FileListElement(filesNames.at(i),false,Type_Elf,NULL)); | |||
|
41 | } | |||
|
42 | break; | |||
|
43 | case 'S': | |||
|
44 | file.seek(0); | |||
|
45 | line = file.readLine(); | |||
|
46 | if(srecFile::checkSum(line)) | |||
|
47 | { | |||
|
48 | files.append(new FileListElement(filesNames.at(i),false,Type_SREC,NULL)); | |||
|
49 | } | |||
|
50 | break; | |||
|
51 | default: | |||
|
52 | files.append(new FileListElement(filesNames.at(i),false,Type_Bin,NULL)); | |||
|
53 | break; | |||
|
54 | } | |||
|
55 | } | |||
|
56 | } | |||
|
57 | ||||
|
58 | } | |||
|
59 | ||||
|
60 | ||||
|
61 | ||||
|
62 |
@@ -0,0 +1,42 | |||||
|
1 | #ifndef GENERICBINARYFILEWIDGET_H | |||
|
2 | #define GENERICBINARYFILEWIDGET_H | |||
|
3 | ||||
|
4 | #include <QWidget> | |||
|
5 | #include <QString> | |||
|
6 | #include <QStringList> | |||
|
7 | #include <abstractbinfile.h> | |||
|
8 | ||||
|
9 | namespace Ui { | |||
|
10 | class genericBinaryFileWidget; | |||
|
11 | } | |||
|
12 | ||||
|
13 | typedef enum {Type_SREC,Type_Bin,Type_Elf}FileTypeEnum; | |||
|
14 | class FileListElement | |||
|
15 | { | |||
|
16 | public: | |||
|
17 | FileListElement() {} | |||
|
18 | FileListElement(QString fileName,bool isOpened,FileTypeEnum FileType,abstractBinFileWidget* viewer) | |||
|
19 | :fileName(fileName),isOpened(isOpened),FileType(FileType),viewer(viewer){} | |||
|
20 | QString fileName; | |||
|
21 | bool isOpened; | |||
|
22 | FileTypeEnum FileType; | |||
|
23 | abstractBinFileWidget* viewer; | |||
|
24 | }; | |||
|
25 | ||||
|
26 | class genericBinaryFileWidget : public QWidget | |||
|
27 | { | |||
|
28 | Q_OBJECT | |||
|
29 | ||||
|
30 | public: | |||
|
31 | explicit genericBinaryFileWidget(QWidget *parent = 0); | |||
|
32 | ~genericBinaryFileWidget(); | |||
|
33 | ||||
|
34 | public slots: | |||
|
35 | void openFile(); | |||
|
36 | ||||
|
37 | private: | |||
|
38 | Ui::genericBinaryFileWidget *ui; | |||
|
39 | QList<FileListElement*> files; | |||
|
40 | }; | |||
|
41 | ||||
|
42 | #endif // GENERICBINARYFILEWIDGET_H |
@@ -0,0 +1,103 | |||||
|
1 | <?xml version="1.0" encoding="UTF-8"?> | |||
|
2 | <ui version="4.0"> | |||
|
3 | <class>genericBinaryFileWidget</class> | |||
|
4 | <widget class="QWidget" name="genericBinaryFileWidget"> | |||
|
5 | <property name="geometry"> | |||
|
6 | <rect> | |||
|
7 | <x>0</x> | |||
|
8 | <y>0</y> | |||
|
9 | <width>878</width> | |||
|
10 | <height>360</height> | |||
|
11 | </rect> | |||
|
12 | </property> | |||
|
13 | <property name="acceptDrops"> | |||
|
14 | <bool>false</bool> | |||
|
15 | </property> | |||
|
16 | <property name="windowTitle"> | |||
|
17 | <string>Form</string> | |||
|
18 | </property> | |||
|
19 | <layout class="QGridLayout" name="gridLayout_2"> | |||
|
20 | <item row="0" column="0"> | |||
|
21 | <widget class="QSplitter" name="splitter"> | |||
|
22 | <property name="orientation"> | |||
|
23 | <enum>Qt::Horizontal</enum> | |||
|
24 | </property> | |||
|
25 | <widget class="QWidget" name="widget" native="true"> | |||
|
26 | <layout class="QGridLayout" name="gridLayout"> | |||
|
27 | <item row="1" column="0"> | |||
|
28 | <widget class="QPushButton" name="openFileQpb"> | |||
|
29 | <property name="text"> | |||
|
30 | <string/> | |||
|
31 | </property> | |||
|
32 | <property name="icon"> | |||
|
33 | <iconset resource="../SocExplorerCommon.qrc"> | |||
|
34 | <normaloff>:/images/add.svg</normaloff>:/images/add.svg</iconset> | |||
|
35 | </property> | |||
|
36 | <property name="iconSize"> | |||
|
37 | <size> | |||
|
38 | <width>32</width> | |||
|
39 | <height>32</height> | |||
|
40 | </size> | |||
|
41 | </property> | |||
|
42 | </widget> | |||
|
43 | </item> | |||
|
44 | <item row="1" column="1"> | |||
|
45 | <widget class="QPushButton" name="removeFileQpb"> | |||
|
46 | <property name="text"> | |||
|
47 | <string/> | |||
|
48 | </property> | |||
|
49 | <property name="icon"> | |||
|
50 | <iconset resource="../SocExplorerCommon.qrc"> | |||
|
51 | <normaloff>:/images/trash.svg</normaloff>:/images/trash.svg</iconset> | |||
|
52 | </property> | |||
|
53 | <property name="iconSize"> | |||
|
54 | <size> | |||
|
55 | <width>32</width> | |||
|
56 | <height>32</height> | |||
|
57 | </size> | |||
|
58 | </property> | |||
|
59 | </widget> | |||
|
60 | </item> | |||
|
61 | <item row="1" column="2"> | |||
|
62 | <spacer name="horizontalSpacer"> | |||
|
63 | <property name="orientation"> | |||
|
64 | <enum>Qt::Horizontal</enum> | |||
|
65 | </property> | |||
|
66 | <property name="sizeHint" stdset="0"> | |||
|
67 | <size> | |||
|
68 | <width>40</width> | |||
|
69 | <height>20</height> | |||
|
70 | </size> | |||
|
71 | </property> | |||
|
72 | </spacer> | |||
|
73 | </item> | |||
|
74 | <item row="0" column="0" colspan="3"> | |||
|
75 | <widget class="QTableWidget" name="tableWidget"> | |||
|
76 | <column> | |||
|
77 | <property name="text"> | |||
|
78 | <string>File</string> | |||
|
79 | </property> | |||
|
80 | </column> | |||
|
81 | <column> | |||
|
82 | <property name="text"> | |||
|
83 | <string>Type</string> | |||
|
84 | </property> | |||
|
85 | </column> | |||
|
86 | </widget> | |||
|
87 | </item> | |||
|
88 | </layout> | |||
|
89 | </widget> | |||
|
90 | <widget class="QTabWidget" name="fileViewerTab"> | |||
|
91 | <property name="currentIndex"> | |||
|
92 | <number>-1</number> | |||
|
93 | </property> | |||
|
94 | </widget> | |||
|
95 | </widget> | |||
|
96 | </item> | |||
|
97 | </layout> | |||
|
98 | </widget> | |||
|
99 | <resources> | |||
|
100 | <include location="../SocExplorerCommon.qrc"/> | |||
|
101 | </resources> | |||
|
102 | <connections/> | |||
|
103 | </ui> |
@@ -0,0 +1,456 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #include "srecfile.h" | |||
|
23 | #include <QTextStream> | |||
|
24 | #include "binaryfile.h" | |||
|
25 | ||||
|
26 | srecFile::srecFile() | |||
|
27 | { | |||
|
28 | p_mergingRecords = true; | |||
|
29 | } | |||
|
30 | ||||
|
31 | srecFile::srecFile(const QString &File) | |||
|
32 | { | |||
|
33 | p_mergingRecords = true; | |||
|
34 | openFile(File); | |||
|
35 | } | |||
|
36 | ||||
|
37 | srecFile::srecFile(const QStringList &Files) | |||
|
38 | { | |||
|
39 | p_mergingRecords = true; | |||
|
40 | openFiles(Files); | |||
|
41 | } | |||
|
42 | ||||
|
43 | srecFile::~srecFile() | |||
|
44 | { | |||
|
45 | ||||
|
46 | } | |||
|
47 | ||||
|
48 | bool srecFile::openFile(const QString &File) | |||
|
49 | { | |||
|
50 | return openFiles(QStringList()<<File); | |||
|
51 | } | |||
|
52 | ||||
|
53 | bool srecFile::openFiles(const QStringList &Files) | |||
|
54 | { | |||
|
55 | for(int i=0;i<Files.count();i++) | |||
|
56 | { | |||
|
57 | this->p_isSrec=true; | |||
|
58 | this->p_isSrec &= isSREC(Files.at(i)); | |||
|
59 | this->p_files.append(new QFile(Files.at(i))); | |||
|
60 | this->p_files.at(i)->open(QIODevice::ReadOnly); | |||
|
61 | parseFile(this->p_files.at(i)); | |||
|
62 | } | |||
|
63 | return true; | |||
|
64 | } | |||
|
65 | ||||
|
66 | bool srecFile::isopened() | |||
|
67 | { | |||
|
68 | bool opened = true; | |||
|
69 | for(int i=0;i<this->p_files.count();i++) | |||
|
70 | { | |||
|
71 | opened &= p_files.at(i)->isOpen(); | |||
|
72 | } | |||
|
73 | return opened; | |||
|
74 | } | |||
|
75 | ||||
|
76 | int srecFile::closeFile() | |||
|
77 | { | |||
|
78 | for(int i=0;i<p_files.count();i++) | |||
|
79 | { | |||
|
80 | delete p_files.at(i); | |||
|
81 | delete p_fragments.at(i); | |||
|
82 | } | |||
|
83 | p_fragments.clear(); | |||
|
84 | p_files.clear(); | |||
|
85 | p_fileName.clear(); | |||
|
86 | return 0; | |||
|
87 | } | |||
|
88 | ||||
|
89 | QList<codeFragment *> srecFile::getFragments() | |||
|
90 | { | |||
|
91 | return p_fragments; | |||
|
92 | } | |||
|
93 | ||||
|
94 | bool srecFile::toSrec(QList<codeFragment *> fragments, const QString &File) | |||
|
95 | { | |||
|
96 | QString line; | |||
|
97 | QFile file(File); | |||
|
98 | file.open(QIODevice::WriteOnly); | |||
|
99 | if(file.isOpen()) | |||
|
100 | { | |||
|
101 | QTextStream stream( &file ); | |||
|
102 | //First build header | |||
|
103 | stream << buildRecord(0,0,File.toStdString().c_str(),File.count()); | |||
|
104 | for(int i=0;i<fragments.count();i++) | |||
|
105 | { | |||
|
106 | codeFragment *fragment = fragments.at(i); | |||
|
107 | for(int j=0;j<((int)(fragment->size)/16);j++) | |||
|
108 | { | |||
|
109 | stream << buildRecord(3,fragment->address+(j*16),fragment->data+(j*16),16); | |||
|
110 | } | |||
|
111 | int rem = fragment->size % 16; | |||
|
112 | if(rem) | |||
|
113 | { | |||
|
114 | stream << buildRecord(3,fragment->address+fragment->size-rem,fragment->data+fragment->size-rem,rem); | |||
|
115 | } | |||
|
116 | stream << buildRecord(7,fragment->address,NULL,0); | |||
|
117 | } | |||
|
118 | file.close(); | |||
|
119 | return true; | |||
|
120 | } | |||
|
121 | ||||
|
122 | return false; | |||
|
123 | } | |||
|
124 | ||||
|
125 | bool srecFile::toSrec(const QString &File) | |||
|
126 | { | |||
|
127 | return toSrec(p_fragments,File); | |||
|
128 | } | |||
|
129 | ||||
|
130 | bool srecFile::toBinary(const QString &File) | |||
|
131 | { | |||
|
132 | return binaryFile::toBinary(p_fragments,File); | |||
|
133 | } | |||
|
134 | ||||
|
135 | int srecFile::lineCount() | |||
|
136 | { | |||
|
137 | return p_lineCount; | |||
|
138 | } | |||
|
139 | ||||
|
140 | int srecFile::getFragmentsCount() | |||
|
141 | { | |||
|
142 | return p_fragments.count(); | |||
|
143 | } | |||
|
144 | ||||
|
145 | int srecFile::getFragmentAddress(int index) | |||
|
146 | { | |||
|
147 | if((index < p_fragments.count()) && (index>=0)) | |||
|
148 | { | |||
|
149 | return p_fragments.at(index)->address; | |||
|
150 | } | |||
|
151 | return 0; | |||
|
152 | } | |||
|
153 | ||||
|
154 | int srecFile::getFragmentSize(int index) | |||
|
155 | { | |||
|
156 | if((index < p_fragments.count()) && (index>=0)) | |||
|
157 | { | |||
|
158 | return p_fragments.at(index)->size; | |||
|
159 | } | |||
|
160 | return 0; | |||
|
161 | } | |||
|
162 | ||||
|
163 | codeFragment *srecFile::getFragment(int index) | |||
|
164 | { | |||
|
165 | if((index < p_fragments.count()) && (index>=0)) | |||
|
166 | { | |||
|
167 | return p_fragments.at(index); | |||
|
168 | } | |||
|
169 | return NULL; | |||
|
170 | } | |||
|
171 | ||||
|
172 | QString srecFile::getFragmentHeader(int index) | |||
|
173 | { | |||
|
174 | if((index < p_fragments.count()) && (index>=0)) | |||
|
175 | { | |||
|
176 | return p_fragments.at(index)->header; | |||
|
177 | } | |||
|
178 | return ""; | |||
|
179 | } | |||
|
180 | ||||
|
181 | bool srecFile::getFragmentData(int index, char **buffer) | |||
|
182 | { | |||
|
183 | ||||
|
184 | if((index < p_fragments.count()) && (index>=0)) | |||
|
185 | { | |||
|
186 | *buffer = (char *)this->p_fragments.at(index)->data; | |||
|
187 | return true; | |||
|
188 | } | |||
|
189 | return false; | |||
|
190 | } | |||
|
191 | ||||
|
192 | bool srecFile::mergingRecords() | |||
|
193 | { | |||
|
194 | return p_mergingRecords; | |||
|
195 | } | |||
|
196 | ||||
|
197 | void srecFile::setMergingRecords(bool enabled) | |||
|
198 | { | |||
|
199 | p_mergingRecords = enabled; | |||
|
200 | } | |||
|
201 | ||||
|
202 | bool srecFile::isSREC() | |||
|
203 | { | |||
|
204 | return p_isSrec & isopened(); | |||
|
205 | } | |||
|
206 | ||||
|
207 | bool srecFile::isSREC(const QString &File) | |||
|
208 | { | |||
|
209 | QFile file(File); | |||
|
210 | file.open(QIODevice::ReadOnly); | |||
|
211 | if(file.isOpen()) | |||
|
212 | { | |||
|
213 | file.seek(0); | |||
|
214 | QString line=file.readLine(); | |||
|
215 | file.close(); | |||
|
216 | return ((line.at(0)=='S')&&(line.at(1)=='0')); | |||
|
217 | } | |||
|
218 | return false; | |||
|
219 | } | |||
|
220 | ||||
|
221 | ||||
|
222 | void srecFile::parseFile(QFile *file) | |||
|
223 | { | |||
|
224 | if(file->isOpen()) | |||
|
225 | { | |||
|
226 | this->p_lineCount = 0; | |||
|
227 | file->seek(0); | |||
|
228 | codeFragment* fragment=NULL; | |||
|
229 | bool newFragment=true; | |||
|
230 | char* data; | |||
|
231 | quint64 size=0; | |||
|
232 | quint64 address=-1; | |||
|
233 | QString header; | |||
|
234 | while (!file->atEnd()) | |||
|
235 | { | |||
|
236 | QString line = file->readLine(); | |||
|
237 | p_lineCount++; | |||
|
238 | int rectype = parseLine(line,&address,&data,&size); | |||
|
239 | if(rectype==0) | |||
|
240 | { | |||
|
241 | header.clear(); | |||
|
242 | header.append(data); | |||
|
243 | fragment = new codeFragment(data,size,address); | |||
|
244 | fragment->header = header; | |||
|
245 | p_fragments.append(fragment); | |||
|
246 | } | |||
|
247 | else | |||
|
248 | { | |||
|
249 | if((rectype>=1) && (rectype<=3)) | |||
|
250 | { | |||
|
251 | if(p_mergingRecords) | |||
|
252 | { | |||
|
253 | //Could I merge it with an other fragment? | |||
|
254 | bool merged = false; | |||
|
255 | for(int i=0;i<p_fragments.count();i++) | |||
|
256 | { | |||
|
257 | codeFragment* frag = p_fragments.at(i); | |||
|
258 | if(((frag->address+frag->size)==address) && (merged==false) && (size!=0)) | |||
|
259 | { | |||
|
260 | merged = mergeFragment(frag,data,size); | |||
|
261 | } | |||
|
262 | } | |||
|
263 | if(!merged) | |||
|
264 | { | |||
|
265 | fragment = new codeFragment(data,size,address); | |||
|
266 | fragment->header = header; | |||
|
267 | p_fragments.append(fragment); | |||
|
268 | } | |||
|
269 | } | |||
|
270 | else | |||
|
271 | { | |||
|
272 | if(newFragment) | |||
|
273 | { | |||
|
274 | fragment = new codeFragment(data,size,address); | |||
|
275 | fragment->header = header; | |||
|
276 | p_fragments.append(fragment); | |||
|
277 | newFragment = false; | |||
|
278 | } | |||
|
279 | else | |||
|
280 | { | |||
|
281 | codeFragment* frag = p_fragments.last(); | |||
|
282 | mergeFragment(frag,data,size); | |||
|
283 | } | |||
|
284 | } | |||
|
285 | ||||
|
286 | } | |||
|
287 | else | |||
|
288 | { | |||
|
289 | if((rectype>=7) && (rectype<=9)) | |||
|
290 | { | |||
|
291 | newFragment = true; | |||
|
292 | } | |||
|
293 | } | |||
|
294 | } | |||
|
295 | } | |||
|
296 | } | |||
|
297 | } | |||
|
298 | ||||
|
299 | ||||
|
300 | int srecFile::parseLine(const QString &record, quint64 *address, char **data, quint64 *size) | |||
|
301 | { | |||
|
302 | #define newData (*data) | |||
|
303 | #define newAddress (*address) | |||
|
304 | #define newSize (*size) | |||
|
305 | int recType = -1; | |||
|
306 | if((record.count()>4) && checkSum(record)) | |||
|
307 | { | |||
|
308 | if(record.at(0)=='S') | |||
|
309 | { | |||
|
310 | recType = record.at(1).toLatin1() & 0x0F; | |||
|
311 | //Header type | |||
|
312 | if(recType==0) | |||
|
313 | { | |||
|
314 | newAddress = record.mid(4,4).toInt(0,16); | |||
|
315 | newSize = record.mid(2,2).toInt(0,16) - 3; | |||
|
316 | if(newSize>0) | |||
|
317 | { | |||
|
318 | newData=(char*)malloc(newSize+1); | |||
|
319 | for(int i=0;i<(int)newSize;i++) | |||
|
320 | { | |||
|
321 | newData[i] = ((char)record.mid((2*i)+8,2).toInt(0,16)); | |||
|
322 | } | |||
|
323 | newData[newSize] = '\0'; // force string end for header | |||
|
324 | } | |||
|
325 | } | |||
|
326 | //2 address byte record type | |||
|
327 | if((recType==1) || (recType==5) || (recType==9)) | |||
|
328 | { | |||
|
329 | newAddress = record.mid(4,4).toInt(0,16); | |||
|
330 | newSize = record.mid(2,2).toInt(0,16) - 3; | |||
|
331 | if(newSize>0) | |||
|
332 | { | |||
|
333 | newData=(char*)malloc(newSize); | |||
|
334 | for(int i=0;i<(int)newSize;i++) | |||
|
335 | { | |||
|
336 | newData[i] = ((char)record.mid((2*i)+8,2).toInt(0,16)); | |||
|
337 | } | |||
|
338 | } | |||
|
339 | } | |||
|
340 | //3 address byte record type | |||
|
341 | if((recType==2) || (recType==6) || (recType==8)) | |||
|
342 | { | |||
|
343 | newAddress = record.mid(4,6).toInt(0,16); | |||
|
344 | newSize = record.mid(2,2).toInt(0,16) - 4; | |||
|
345 | if(newSize>0) | |||
|
346 | { | |||
|
347 | newData=(char*)malloc(newSize); | |||
|
348 | for(int i=0;i<(int)newSize;i++) | |||
|
349 | { | |||
|
350 | newData[i] = ((char)record.mid((2*i)+10,2).toInt(0,16)); | |||
|
351 | } | |||
|
352 | } | |||
|
353 | } | |||
|
354 | //4 address byte record type | |||
|
355 | if((recType==3) || (recType==7)) | |||
|
356 | { | |||
|
357 | newAddress = record.mid(4,8).toInt(0,16); | |||
|
358 | newSize = record.mid(2,2).toInt(0,16) - 5; | |||
|
359 | if(newSize>0) | |||
|
360 | { | |||
|
361 | newData=(char*)malloc(newSize); | |||
|
362 | for(int i=0;i<(int)newSize;i++) | |||
|
363 | { | |||
|
364 | newData[i] = ((char)record.mid((2*i)+12,2).toInt(0,16)); | |||
|
365 | } | |||
|
366 | } | |||
|
367 | } | |||
|
368 | } | |||
|
369 | } | |||
|
370 | return recType; | |||
|
371 | } | |||
|
372 | ||||
|
373 | ||||
|
374 | char srecFile::lineCheckSum(const QString &line) | |||
|
375 | { | |||
|
376 | char sum=0; | |||
|
377 | QString localLine = line; | |||
|
378 | bool ok; | |||
|
379 | if(localLine.at(0)=='S') // then should skip the first two digits | |||
|
380 | { | |||
|
381 | localLine.remove(0,2); | |||
|
382 | } | |||
|
383 | for(int i=0;i<localLine.count();i+=2) | |||
|
384 | { | |||
|
385 | sum+=(char)(localLine.mid(i,2).toInt(&ok,16)); | |||
|
386 | } | |||
|
387 | return ~sum; | |||
|
388 | } | |||
|
389 | ||||
|
390 | bool srecFile::checkSum(const QString &line) | |||
|
391 | { | |||
|
392 | QString scp=line; | |||
|
393 | scp.remove('\n'); | |||
|
394 | scp.remove('\r'); | |||
|
395 | char ck2 = (char)scp.mid(scp.count()-2,2).toInt(0,16); | |||
|
396 | char ck=lineCheckSum(scp.remove(scp.count()-2,2)); | |||
|
397 | if(ck==ck2) | |||
|
398 | { | |||
|
399 | return true; | |||
|
400 | } | |||
|
401 | return false; | |||
|
402 | // return (ck2==ck); | |||
|
403 | } | |||
|
404 | ||||
|
405 | ||||
|
406 | QString srecFile::buildRecord(int recType, int address,const char *data, int size) | |||
|
407 | { | |||
|
408 | QString record; | |||
|
409 | if((recType>=0) && (recType<=9)) | |||
|
410 | { | |||
|
411 | record.append("S"); | |||
|
412 | record.append(QString::number(recType)); | |||
|
413 | //2 address byte record type | |||
|
414 | if((recType==0) || (recType==1) || (recType==5) || (recType==9)) | |||
|
415 | { | |||
|
416 | record.append(QString("%1").arg(3+size,2,16).replace(' ','0')); | |||
|
417 | record.append(QString("%1").arg(address,4,16).replace(' ','0')); | |||
|
418 | } | |||
|
419 | //3 address byte record type | |||
|
420 | if((recType==2) || (recType==6) || (recType==8)) | |||
|
421 | { | |||
|
422 | record.append(QString("%1").arg(4+size,2,16).replace(' ','0')); | |||
|
423 | record.append(QString("%1").arg(address,6,16).replace(' ','0')); | |||
|
424 | } | |||
|
425 | //4 address byte record type | |||
|
426 | if((recType==3) || (recType==7)) | |||
|
427 | { | |||
|
428 | record.append(QString("%1").arg(5+size,2,16).replace(' ','0')); | |||
|
429 | record.append(QString("%1").arg(address,8,16).replace(' ','0')); | |||
|
430 | } | |||
|
431 | for(int i=0; i<size;i++) | |||
|
432 | { | |||
|
433 | record.append(QString("%1").arg((uchar)data[i],2,16).replace(' ','0')); | |||
|
434 | } | |||
|
435 | record.append(QString("%1").arg((uchar)srecFile::lineCheckSum(record),2,16).replace(' ','0')); | |||
|
436 | record.append('\n'); | |||
|
437 | } | |||
|
438 | return record.toUpper(); | |||
|
439 | } | |||
|
440 | ||||
|
441 | bool srecFile::mergeFragment(codeFragment *fragment, char *data, int size) | |||
|
442 | { | |||
|
443 | char* mergedData=(char*)malloc(size+fragment->size); | |||
|
444 | if(mergedData!=NULL) | |||
|
445 | { | |||
|
446 | memcpy(mergedData,fragment->data,fragment->size); | |||
|
447 | memcpy(mergedData+fragment->size,data,size); | |||
|
448 | free(fragment->data); | |||
|
449 | free(data); | |||
|
450 | fragment->data = mergedData; | |||
|
451 | fragment->size = fragment->size+size; | |||
|
452 | return true; | |||
|
453 | } | |||
|
454 | return false; | |||
|
455 | } | |||
|
456 |
@@ -0,0 +1,77 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #ifndef SRECFILE_H | |||
|
23 | #define SRECFILE_H | |||
|
24 | ||||
|
25 | #include <QObject> | |||
|
26 | #include <abstractbinfile.h> | |||
|
27 | #include <QFile> | |||
|
28 | #include <QStringList> | |||
|
29 | ||||
|
30 | class srecFile : public abstractBinFile | |||
|
31 | { | |||
|
32 | Q_OBJECT | |||
|
33 | public: | |||
|
34 | explicit srecFile(); | |||
|
35 | srecFile(const QString& File); | |||
|
36 | srecFile(const QStringList& Files); | |||
|
37 | ~srecFile(); | |||
|
38 | bool openFile(const QString& File); | |||
|
39 | bool openFiles(const QStringList& Files); | |||
|
40 | bool isopened(); | |||
|
41 | int closeFile(); | |||
|
42 | QList<codeFragment*> getFragments(); | |||
|
43 | static bool toSrec(QList<codeFragment*> fragments,const QString& File); | |||
|
44 | bool toSrec(const QString &File); | |||
|
45 | bool toBinary(const QString& File); | |||
|
46 | int lineCount(); | |||
|
47 | int getFragmentsCount(); | |||
|
48 | int getFragmentAddress(int index); | |||
|
49 | int getFragmentSize(int index); | |||
|
50 | codeFragment *getFragment(int index); | |||
|
51 | QString getFragmentHeader(int index); | |||
|
52 | bool getFragmentData(int index, char **buffer); | |||
|
53 | ||||
|
54 | bool mergingRecords(); | |||
|
55 | void setMergingRecords(bool enabled); | |||
|
56 | bool isSREC(); | |||
|
57 | static bool isSREC(const QString& File); | |||
|
58 | static bool checkSum(const QString& line); | |||
|
59 | signals: | |||
|
60 | ||||
|
61 | public slots: | |||
|
62 | private: | |||
|
63 | void parseFile(QFile* file); | |||
|
64 | static int parseLine(const QString& record, quint64 *address, char** data, quint64 *size); | |||
|
65 | static char lineCheckSum(const QString& line); | |||
|
66 | static QString buildRecord(int recType,int address,const char* data,int size); | |||
|
67 | static bool mergeFragment(codeFragment* fragment, char* data, int size); | |||
|
68 | QStringList p_fileNames; | |||
|
69 | QList<QFile*>p_files; | |||
|
70 | QList<codeFragment*> p_fragments; | |||
|
71 | int p_lineCount; | |||
|
72 | bool p_isSrec; | |||
|
73 | bool p_mergingRecords; | |||
|
74 | ||||
|
75 | }; | |||
|
76 | ||||
|
77 | #endif // SRECFILE_H |
@@ -0,0 +1,144 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #include "srecfilewidget.h" | |||
|
23 | #include "ui_srecfilewidget.h" | |||
|
24 | #include <QTableWidgetItem> | |||
|
25 | #include <qtablewidgetintitem.h> | |||
|
26 | #include <QtWidgets/QFileDialog> | |||
|
27 | #include "binaryfile.h" | |||
|
28 | ||||
|
29 | srecFileWidget::srecFileWidget(QWidget *parent) : | |||
|
30 | abstractBinFileWidget(parent), | |||
|
31 | ui(new Ui::srecFileWidget) | |||
|
32 | { | |||
|
33 | ui->setupUi(this); | |||
|
34 | connect(this->ui->fragmentsList,SIGNAL(cellActivated(int,int)),this,SLOT(recordCellActivated(int,int))); | |||
|
35 | this->setWindowTitle("SocExplorer SREC viewer"); | |||
|
36 | exportToSREC_action = new QAction(tr("Export to SREC"),this); | |||
|
37 | exportToBIN_action = new QAction(tr("Export to Binary"),this); | |||
|
38 | this->ui->fragmentsList->addAction(exportToBIN_action); | |||
|
39 | this->ui->fragmentsList->addAction(exportToSREC_action); | |||
|
40 | connect(this->exportToBIN_action,SIGNAL(triggered()),this,SLOT(exportToBIN())); | |||
|
41 | connect(this->exportToSREC_action,SIGNAL(triggered()),this,SLOT(exportToSREC())); | |||
|
42 | } | |||
|
43 | ||||
|
44 | srecFileWidget::~srecFileWidget() | |||
|
45 | { | |||
|
46 | delete ui; | |||
|
47 | } | |||
|
48 | ||||
|
49 | void srecFileWidget::setFile(abstractBinFile *file) | |||
|
50 | { | |||
|
51 | this->p_srec = (srecFile*)file; | |||
|
52 | if(p_srec->isopened() && p_srec->isSREC()) | |||
|
53 | { | |||
|
54 | reloadFile(); | |||
|
55 | } | |||
|
56 | } | |||
|
57 | ||||
|
58 | void srecFileWidget::reloadFile() | |||
|
59 | { | |||
|
60 | this->ui->fragmentsList->clear(); | |||
|
61 | this->ui->fragmentsList->setRowCount(p_srec->getFragmentsCount()); | |||
|
62 | this->ui->fragmentsList->setHorizontalHeaderLabels(QStringList()<<"Index"<<"Address"<<"Size"<<"Header"); | |||
|
63 | for(int i=0;i<p_srec->getFragmentsCount();i++) | |||
|
64 | { | |||
|
65 | QTableWidgetItem *newItem = (QTableWidgetItem*)new QTableWidgetIntItem(QString("%1").arg(i),DecimalItem); | |||
|
66 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
67 | this->ui->fragmentsList->setItem(i, 0, newItem); | |||
|
68 | ||||
|
69 | newItem = (QTableWidgetItem*)new QTableWidgetIntItem(QString("0x%1").arg(p_srec->getFragmentAddress(i),8,16).replace(" ","0"),HexaDecimalItem); | |||
|
70 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
71 | this->ui->fragmentsList->setItem(i, 1, newItem); | |||
|
72 | ||||
|
73 | newItem = (QTableWidgetItem*)new QTableWidgetIntItem(QString("%1").arg(p_srec->getFragmentSize(i)),DecimalItem); | |||
|
74 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
75 | this->ui->fragmentsList->setItem(i, 2, newItem); | |||
|
76 | ||||
|
77 | newItem = new QTableWidgetItem(p_srec->getFragmentHeader(i)); | |||
|
78 | newItem->setFlags(newItem->flags() ^ Qt::ItemIsEditable); | |||
|
79 | this->ui->fragmentsList->setItem(i, 3, newItem); | |||
|
80 | ||||
|
81 | } | |||
|
82 | this->ui->fragmentsList->resizeColumnsToContents(); | |||
|
83 | } | |||
|
84 | ||||
|
85 | void srecFileWidget::recordCellActivated(int row, int column) | |||
|
86 | { | |||
|
87 | Q_UNUSED(column) | |||
|
88 | char* buff=NULL; | |||
|
89 | int index = this->ui->fragmentsList->item(row,0)->text().toInt(); | |||
|
90 | if(index!=-1) | |||
|
91 | { | |||
|
92 | this->p_srec->getFragmentData(index,&buff); | |||
|
93 | this->ui->fragmentHexView->setData(QByteArray(buff,this->p_srec->getFragmentSize(index))); | |||
|
94 | this->ui->fragmentHexView->setAddressOffset(this->p_srec->getFragmentAddress(index)); | |||
|
95 | } | |||
|
96 | ||||
|
97 | } | |||
|
98 | ||||
|
99 | void srecFileWidget::exportToSREC() | |||
|
100 | { | |||
|
101 | QList<codeFragment *> SelectedFragmentsList=getSelectedFragments(); | |||
|
102 | if(SelectedFragmentsList.count()>0) | |||
|
103 | { | |||
|
104 | QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), | |||
|
105 | NULL, | |||
|
106 | tr("SREC Files (*.srec)")); | |||
|
107 | if(!fileName.isEmpty()) | |||
|
108 | { | |||
|
109 | srecFile::toSrec(SelectedFragmentsList,fileName); | |||
|
110 | } | |||
|
111 | } | |||
|
112 | } | |||
|
113 | ||||
|
114 | void srecFileWidget::exportToBIN() | |||
|
115 | { | |||
|
116 | QList<codeFragment *> SelectedFragmentsList=getSelectedFragments(); | |||
|
117 | if(SelectedFragmentsList.count()>0) | |||
|
118 | { | |||
|
119 | QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), | |||
|
120 | NULL, | |||
|
121 | tr("Binary Files (*.bin)")); | |||
|
122 | if(!fileName.isEmpty()) | |||
|
123 | { | |||
|
124 | binaryFile::toBinary(SelectedFragmentsList,fileName); | |||
|
125 | } | |||
|
126 | } | |||
|
127 | } | |||
|
128 | ||||
|
129 | QList<codeFragment *> srecFileWidget::getSelectedFragments() | |||
|
130 | { | |||
|
131 | QList<codeFragment *> SelectedFragmentsList; | |||
|
132 | QList<QTableWidgetItem*> items = this->ui->fragmentsList->selectedItems(); | |||
|
133 | for(int i=0;i<items.count();i++) | |||
|
134 | { | |||
|
135 | codeFragment * fragment = p_srec->getFragment(items.at(i)->row()); | |||
|
136 | if(!SelectedFragmentsList.contains(fragment)) | |||
|
137 | { | |||
|
138 | SelectedFragmentsList.append(fragment); | |||
|
139 | } | |||
|
140 | } | |||
|
141 | return SelectedFragmentsList; | |||
|
142 | } | |||
|
143 | ||||
|
144 |
@@ -0,0 +1,58 | |||||
|
1 | /*------------------------------------------------------------------------------ | |||
|
2 | -- This file is a part of the SocExplorer Software | |||
|
3 | -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS | |||
|
4 | -- | |||
|
5 | -- This program is free software; you can redistribute it and/or modify | |||
|
6 | -- it under the terms of the GNU General Public License as published by | |||
|
7 | -- the Free Software Foundation; either version 2 of the License, or | |||
|
8 | -- (at your option) any later version. | |||
|
9 | -- | |||
|
10 | -- This program is distributed in the hope that it will be useful, | |||
|
11 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
|
12 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
|
13 | -- GNU General Public License for more details. | |||
|
14 | -- | |||
|
15 | -- You should have received a copy of the GNU General Public License | |||
|
16 | -- along with this program; if not, write to the Free Software | |||
|
17 | -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||
|
18 | -------------------------------------------------------------------------------*/ | |||
|
19 | /*-- Author : Alexis Jeandet | |||
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |||
|
21 | ----------------------------------------------------------------------------*/ | |||
|
22 | #ifndef SRECFILEWIDGET_H | |||
|
23 | #define SRECFILEWIDGET_H | |||
|
24 | ||||
|
25 | #include <QWidget> | |||
|
26 | #include "srecfile.h" | |||
|
27 | #include <QAction> | |||
|
28 | ||||
|
29 | namespace Ui { | |||
|
30 | class srecFileWidget; | |||
|
31 | } | |||
|
32 | ||||
|
33 | class srecFileWidget : public abstractBinFileWidget | |||
|
34 | { | |||
|
35 | Q_OBJECT | |||
|
36 | ||||
|
37 | public: | |||
|
38 | explicit srecFileWidget(QWidget *parent = 0); | |||
|
39 | ~srecFileWidget(); | |||
|
40 | ||||
|
41 | public slots: | |||
|
42 | void setFile(abstractBinFile* file); | |||
|
43 | void reloadFile(); | |||
|
44 | ||||
|
45 | private slots: | |||
|
46 | void recordCellActivated(int row, int column); | |||
|
47 | void exportToSREC(); | |||
|
48 | void exportToBIN(); | |||
|
49 | ||||
|
50 | private: | |||
|
51 | QList<codeFragment *> getSelectedFragments(); | |||
|
52 | Ui::srecFileWidget *ui; | |||
|
53 | srecFile* p_srec; | |||
|
54 | QAction* exportToSREC_action; | |||
|
55 | QAction* exportToBIN_action; | |||
|
56 | }; | |||
|
57 | ||||
|
58 | #endif // SRECFILEWIDGET_H |
@@ -0,0 +1,93 | |||||
|
1 | <?xml version="1.0" encoding="UTF-8"?> | |||
|
2 | <ui version="4.0"> | |||
|
3 | <class>srecFileWidget</class> | |||
|
4 | <widget class="QWidget" name="srecFileWidget"> | |||
|
5 | <property name="geometry"> | |||
|
6 | <rect> | |||
|
7 | <x>0</x> | |||
|
8 | <y>0</y> | |||
|
9 | <width>740</width> | |||
|
10 | <height>516</height> | |||
|
11 | </rect> | |||
|
12 | </property> | |||
|
13 | <property name="windowTitle"> | |||
|
14 | <string>Form</string> | |||
|
15 | </property> | |||
|
16 | <layout class="QGridLayout" name="gridLayout"> | |||
|
17 | <item row="0" column="0"> | |||
|
18 | <widget class="QSplitter" name="splitter"> | |||
|
19 | <property name="orientation"> | |||
|
20 | <enum>Qt::Horizontal</enum> | |||
|
21 | </property> | |||
|
22 | <widget class="QGroupBox" name="groupBox"> | |||
|
23 | <property name="title"> | |||
|
24 | <string>Hexadecimal Viewer</string> | |||
|
25 | </property> | |||
|
26 | <layout class="QVBoxLayout" name="verticalLayout"> | |||
|
27 | <item> | |||
|
28 | <widget class="QHexEdit" name="fragmentHexView" native="true"> | |||
|
29 | <property name="minimumSize"> | |||
|
30 | <size> | |||
|
31 | <width>256</width> | |||
|
32 | <height>0</height> | |||
|
33 | </size> | |||
|
34 | </property> | |||
|
35 | </widget> | |||
|
36 | </item> | |||
|
37 | </layout> | |||
|
38 | </widget> | |||
|
39 | <widget class="QGroupBox" name="groupBox_2"> | |||
|
40 | <property name="title"> | |||
|
41 | <string>SREC records list</string> | |||
|
42 | </property> | |||
|
43 | <layout class="QVBoxLayout" name="verticalLayout_2"> | |||
|
44 | <item> | |||
|
45 | <widget class="QTableWidget" name="fragmentsList"> | |||
|
46 | <property name="contextMenuPolicy"> | |||
|
47 | <enum>Qt::ActionsContextMenu</enum> | |||
|
48 | </property> | |||
|
49 | <attribute name="horizontalHeaderVisible"> | |||
|
50 | <bool>true</bool> | |||
|
51 | </attribute> | |||
|
52 | <attribute name="verticalHeaderVisible"> | |||
|
53 | <bool>false</bool> | |||
|
54 | </attribute> | |||
|
55 | <column> | |||
|
56 | <property name="text"> | |||
|
57 | <string>Index</string> | |||
|
58 | </property> | |||
|
59 | </column> | |||
|
60 | <column> | |||
|
61 | <property name="text"> | |||
|
62 | <string>Address</string> | |||
|
63 | </property> | |||
|
64 | </column> | |||
|
65 | <column> | |||
|
66 | <property name="text"> | |||
|
67 | <string>Size</string> | |||
|
68 | </property> | |||
|
69 | </column> | |||
|
70 | <column> | |||
|
71 | <property name="text"> | |||
|
72 | <string>Header</string> | |||
|
73 | </property> | |||
|
74 | </column> | |||
|
75 | </widget> | |||
|
76 | </item> | |||
|
77 | </layout> | |||
|
78 | </widget> | |||
|
79 | </widget> | |||
|
80 | </item> | |||
|
81 | </layout> | |||
|
82 | </widget> | |||
|
83 | <customwidgets> | |||
|
84 | <customwidget> | |||
|
85 | <class>QHexEdit</class> | |||
|
86 | <extends>QWidget</extends> | |||
|
87 | <header location="global">qhexedit.h</header> | |||
|
88 | <container>1</container> | |||
|
89 | </customwidget> | |||
|
90 | </customwidgets> | |||
|
91 | <resources/> | |||
|
92 | <connections/> | |||
|
93 | </ui> |
General Comments 0
You need to be logged in to leave comments.
Login now