aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/elfreader.cpp
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2014-09-07 23:24:10 +0300
committerOrgad Shaneh <orgads@gmail.com>2014-09-18 13:37:04 +0200
commitf0e2708d3e516a2999818dfc85d0d4809b21171e (patch)
tree7200eab8b0b0e35b219a9da7388de4bb49f7d26d /src/libs/utils/elfreader.cpp
parent63da3cb9e0545fe2ecf143ac32097141e3d4c8af (diff)
Debugger: Support setting substitute path by regexp
This is useful when there are multiple build machines with different path, and the user would like to match anything up to some known directory to his local project (variable support will also be useful - will try to add that later). Syntax: (/home/.*)/KnownSubdir -> /home/my/project Capture group will be replaced by the value. In this example the substitute path will be (in case a source string found such as /home/SomeUser/SomeProject/KnownSubdir/foo.cpp): /home/SomeUser/SomeProject -> /home/my/project Change-Id: I19d03c9388161d8456a86676086dcb06dc3d7370 Reviewed-by: hjk <hjk121@nokiamail.com>
Diffstat (limited to 'src/libs/utils/elfreader.cpp')
-rw-r--r--src/libs/utils/elfreader.cpp55
1 files changed, 24 insertions, 31 deletions
diff --git a/src/libs/utils/elfreader.cpp b/src/libs/utils/elfreader.cpp
index 25bb35cf5b2..b48ae2a7a5d 100644
--- a/src/libs/utils/elfreader.cpp
+++ b/src/libs/utils/elfreader.cpp
@@ -101,33 +101,23 @@ static void parseProgramHeader(const uchar *s, ElfProgramHeader *sh, const ElfDa
sh->memsz = getWord(s, context);
}
-class ElfMapper
+ElfMapper::ElfMapper(const ElfReader *reader) : file(reader->m_binary) {}
+
+bool ElfMapper::map()
{
-public:
- ElfMapper(const ElfReader *reader) : file(reader->m_binary) {}
-
- bool map()
- {
- if (!file.open(QIODevice::ReadOnly))
- return false;
-
- fdlen = file.size();
- ustart = file.map(0, fdlen);
- if (ustart == 0) {
- // Try reading the data into memory instead.
- raw = file.readAll();
- start = raw.constData();
- fdlen = raw.size();
- }
- return true;
+ if (!file.open(QIODevice::ReadOnly))
+ return false;
+
+ fdlen = file.size();
+ ustart = file.map(0, fdlen);
+ if (ustart == 0) {
+ // Try reading the data into memory instead.
+ raw = file.readAll();
+ start = raw.constData();
+ fdlen = raw.size();
}
-
-public:
- QFile file;
- QByteArray raw;
- union { const char *start; const uchar *ustart; };
- quint64 fdlen;
-};
+ return true;
+}
ElfReader::ElfReader(const QString &binary)
: m_binary(binary)
@@ -298,19 +288,22 @@ ElfReader::Result ElfReader::readIt()
return Ok;
}
-QByteArray ElfReader::readSection(const QByteArray &name)
+QSharedPointer<ElfMapper> ElfReader::readSection(const QByteArray &name)
{
+ QSharedPointer<ElfMapper> mapper;
readIt();
int i = m_elfData.indexOf(name);
if (i == -1)
- return QByteArray();
+ return mapper;
- ElfMapper mapper(this);
- if (!mapper.map())
- return QByteArray();
+ mapper.reset(new ElfMapper(this));
+ if (!mapper->map())
+ return mapper;
const ElfSectionHeader &section = m_elfData.sectionHeaders.at(i);
- return QByteArray(mapper.start + section.offset, section.size);
+ mapper->start += section.offset;
+ mapper->fdlen = section.size;
+ return mapper;
}
static QByteArray cutout(const char *s)