-
Notifications
You must be signed in to change notification settings - Fork 327
Expand file tree
/
Copy pathpreloadinjector.cpp
More file actions
90 lines (67 loc) · 2.96 KB
/
Copy pathpreloadinjector.cpp
File metadata and controls
90 lines (67 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/*
preloadinjector.cpp
This file is part of GammaRay, the Qt application inspection and
manipulation tool.
Copyright (C) 2010-2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
Author: Volker Krause <volker.krause@kdab.com>
Licensees holding valid commercial KDAB GammaRay licenses may use this file in
accordance with GammaRay Commercial License Agreement provided with the Software.
Contact info@kdab.com if any conditions of this licensing are not clear to you.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "preloadinjector.h"
#include <libraryutil.h>
#include <probeabidetector.h>
#include <QProcess>
#include <QDebug>
#include <QStandardPaths>
#include <cstdlib>
using namespace GammaRay;
PreloadInjector::PreloadInjector(const QString &probeDllOverride)
: ProcessInjector()
, m_probeDllOverride(probeDllOverride)
{
}
QString PreloadInjector::name() const
{
return QStringLiteral("preload");
}
bool PreloadInjector::launch(const QStringList &programAndArgs, const QString &probeDll,
const QString &probeFunc, const QProcessEnvironment &_env)
{
Q_UNUSED(probeFunc);
const QString actualProbeDll = m_probeDllOverride.isEmpty() ? probeDll : m_probeDllOverride;
QProcessEnvironment env(_env);
#ifdef Q_OS_MAC
env.insert(QStringLiteral("DYLD_INSERT_LIBRARIES"), actualProbeDll);
env.insert(QStringLiteral("GAMMARAY_UNSET_DYLD"), QStringLiteral("1"));
// Make sure Qt do load it's correct libs/plugins.
if (actualProbeDll.contains(QStringLiteral("_debug"), Qt::CaseInsensitive))
env.insert(QStringLiteral("DYLD_IMAGE_SUFFIX"), QStringLiteral("_debug"));
#else
auto exePath = programAndArgs.first();
exePath = QStandardPaths::findExecutable(exePath);
// ASAN requires to be loaded first, so check if the target uses that
// and if so inject it before GammaRay
QStringList ldPreload;
for (const auto &lib: LibraryUtil::dependencies(exePath)) {
if (lib.contains("libasan.so") || lib.contains("libclang_rt.asan")) {
ldPreload.push_back(QString::fromLocal8Bit(lib));
break;
}
}
ldPreload.push_back(actualProbeDll);
env.insert(QStringLiteral("LD_PRELOAD"), ldPreload.join(QLatin1String(":")));
env.insert(QStringLiteral("GAMMARAY_UNSET_PRELOAD"), QStringLiteral("1"));
#endif
return launchProcess(programAndArgs, env);
}