1 | // Copyright (C) 2024 The Qt Company Ltd. |
---|---|
2 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
3 | |
4 | #include "qsymbolsresolveutils_p.h" |
5 | |
6 | #include <qdebug.h> |
7 | #include <algorithm> |
8 | #include <qloggingcategory.h> |
9 | |
10 | QT_BEGIN_NAMESPACE |
11 | |
12 | static Q_LOGGING_CATEGORY(qLcSymbolsResolver, "qt.multimedia.symbolsresolver"); |
13 | |
14 | bool SymbolsResolver::isLazyLoadEnabled() |
15 | { |
16 | static const bool lazyLoad = |
17 | !static_cast<bool>(qEnvironmentVariableIntValue(varName: "QT_INSTANT_LOAD_FFMPEG_STUBS")); |
18 | return lazyLoad; |
19 | } |
20 | |
21 | SymbolsResolver::SymbolsResolver(const char *libLoggingName, LibraryLoader loader) |
22 | : m_libLoggingName(libLoggingName) |
23 | { |
24 | Q_ASSERT(libLoggingName); |
25 | Q_ASSERT(loader); |
26 | |
27 | auto library = loader(); |
28 | if (library && library->isLoaded()) |
29 | m_library = std::move(library); |
30 | else |
31 | qCWarning(qLcSymbolsResolver) << "Couldn't load"<< m_libLoggingName << "library"; |
32 | } |
33 | |
34 | SymbolsResolver::SymbolsResolver(const char *libName, const char *version, |
35 | const char *libLoggingName) |
36 | : m_libLoggingName(libLoggingName ? libLoggingName : libName) |
37 | { |
38 | Q_ASSERT(libName); |
39 | Q_ASSERT(version); |
40 | |
41 | auto library = std::make_unique<QLibrary>(args: QString::fromLocal8Bit(ba: libName), |
42 | args: QString::fromLocal8Bit(ba: version)); |
43 | if (library->load()) |
44 | m_library = std::move(library); |
45 | else |
46 | qCWarning(qLcSymbolsResolver) << "Couldn't load"<< m_libLoggingName << "library"; |
47 | } |
48 | |
49 | SymbolsResolver::~SymbolsResolver() |
50 | { |
51 | if (m_library) |
52 | m_library->unload(); |
53 | } |
54 | |
55 | QFunctionPointer SymbolsResolver::initFunction(const char *funcName) |
56 | { |
57 | if (!m_library) |
58 | return nullptr; |
59 | if (auto func = m_library->resolve(symbol: funcName)) |
60 | return func; |
61 | |
62 | qCWarning(qLcSymbolsResolver) << "Couldn't resolve"<< m_libLoggingName << "symbol"<< funcName; |
63 | m_library->unload(); |
64 | m_library.reset(); |
65 | return nullptr; |
66 | } |
67 | |
68 | void SymbolsResolver::checkLibrariesLoaded(SymbolsMarker *begin, SymbolsMarker *end) |
69 | { |
70 | if (m_library) { |
71 | qCDebug(qLcSymbolsResolver) << m_libLoggingName << "symbols resolved"; |
72 | } else { |
73 | const auto size = reinterpret_cast<char *>(end) - reinterpret_cast<char *>(begin); |
74 | memset(s: begin, c: 0, n: size); |
75 | qCWarning(qLcSymbolsResolver) << "Couldn't resolve"<< m_libLoggingName << "symbols"; |
76 | } |
77 | } |
78 | |
79 | QT_END_NAMESPACE |
80 |