add trusted abi

This commit is contained in:
DuckSoft 2020-05-12 20:53:15 +08:00
parent ff865c1fe7
commit fbf8d071c7
2 changed files with 13 additions and 1 deletions

View File

@ -6,6 +6,7 @@ namespace Qv2ray::core::kernel::abi
{ {
QvKernelABICompatibility checkCompatibility(QvKernelABIType hostType, QvKernelABIType targetType) QvKernelABICompatibility checkCompatibility(QvKernelABIType hostType, QvKernelABIType targetType)
{ {
#ifndef QV2RAY_TRUSTED_ABI
switch (hostType) switch (hostType)
{ {
case ABI_WIN32: case ABI_WIN32:
@ -15,12 +16,19 @@ namespace Qv2ray::core::kernel::abi
case ABI_ELF_X86: return targetType == hostType ? ABI_PERFECT : ABI_NOPE; case ABI_ELF_X86: return targetType == hostType ? ABI_PERFECT : ABI_NOPE;
case ABI_ELF_X86_64: return targetType == hostType ? ABI_PERFECT : targetType == ABI_ELF_X86 ? ABI_MAYBE : ABI_NOPE; case ABI_ELF_X86_64: return targetType == hostType ? ABI_PERFECT : targetType == ABI_ELF_X86 ? ABI_MAYBE : ABI_NOPE;
case ABI_ELF_OTHER: return targetType == hostType ? ABI_PERFECT : ABI_MAYBE; case ABI_ELF_OTHER: return targetType == hostType ? ABI_PERFECT : ABI_MAYBE;
case ABI_TRUSTED: return ABI_PERFECT;
default: return ABI_MAYBE; default: return ABI_MAYBE;
} }
#else
return ABI_PERFECT;
#endif
} }
std::pair<std::optional<QvKernelABIType>, std::optional<QString>> deduceKernelABI(const QString &pathCoreExecutable) std::pair<std::optional<QvKernelABIType>, std::optional<QString>> deduceKernelABI(const QString &pathCoreExecutable)
{ {
#ifdef QV2RAY_TRUSTED_ABI
return QvKernelABIType::ABI_TRUSTED;
#else
QFile file(pathCoreExecutable); QFile file(pathCoreExecutable);
if (!file.exists()) if (!file.exists())
return { std::nullopt, QObject::tr("core executable file %1 does not exist").arg(pathCoreExecutable) }; return { std::nullopt, QObject::tr("core executable file %1 does not exist").arg(pathCoreExecutable) };
@ -55,6 +63,7 @@ namespace Qv2ray::core::kernel::abi
return { QvKernelABIType::ABI_MACH_O, std::nullopt }; return { QvKernelABIType::ABI_MACH_O, std::nullopt };
else else
return { std::nullopt, QObject::tr("cannot deduce the type of core executable file %1").arg(pathCoreExecutable) }; return { std::nullopt, QObject::tr("cannot deduce the type of core executable file %1").arg(pathCoreExecutable) };
#endif
} }
QString abiToString(QvKernelABIType abi) QString abiToString(QvKernelABIType abi)
@ -68,6 +77,7 @@ namespace Qv2ray::core::kernel::abi
case ABI_ELF_AARCH64: return QObject::tr("ELF arm64 executable"); case ABI_ELF_AARCH64: return QObject::tr("ELF arm64 executable");
case ABI_ELF_ARM: return QObject::tr("ELF arm executable"); case ABI_ELF_ARM: return QObject::tr("ELF arm executable");
case ABI_ELF_OTHER: return QObject::tr("other ELF executable"); case ABI_ELF_OTHER: return QObject::tr("other ELF executable");
case ABI_TRUSTED: return QObject::tr("trusted abi");
default: return QObject::tr("unknown abi"); default: return QObject::tr("unknown abi");
} }
} }

View File

@ -19,6 +19,7 @@ namespace Qv2ray::core::kernel
ABI_ELF_AARCH64, ABI_ELF_AARCH64,
ABI_ELF_ARM, ABI_ELF_ARM,
ABI_ELF_OTHER, ABI_ELF_OTHER,
ABI_TRUSTED,
}; };
enum QvKernelABICompatibility enum QvKernelABICompatibility
@ -42,7 +43,8 @@ namespace Qv2ray::core::kernel
#elif defined(Q_OS_LINUX) && defined(Q_PROCESSOR_ARM_V7) #elif defined(Q_OS_LINUX) && defined(Q_PROCESSOR_ARM_V7)
QvKernelABIType::ABI_ELF_ARM; QvKernelABIType::ABI_ELF_ARM;
#else #else
#error "unknown architecture" QvKernelABIType::ABI_TRUSTED;
#define QV2RAY_TRUSTED_ABI
#endif #endif
std::pair<std::optional<QvKernelABIType>, std::optional<QString>> deduceKernelABI(const QString &pathCoreExecutable); std::pair<std::optional<QvKernelABIType>, std::optional<QString>> deduceKernelABI(const QString &pathCoreExecutable);