Languages: English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Русский | العربية
NeverD компилирует замену выбранным компилятором и устанавливает её по явно указанному адресу входа исходной функции. Компилятор отвечает за семантику C/C++, NeverD — за привязку адресов, релокации, память, записи раскрутки стека и публикацию. Исправление бинарного кода и переписывание поднятого кода сохраняют свои конвейеры. Остальная программа не пересобирается.
Выберите --compiler=clang, --compiler=gcc или --compiler=neverc. Clang и обычный режим NeverC могут создавать LLVM IR; артефакт object сохраняет машинные инструкции производителя. CLI по умолчанию выбирает объекты для GCC. Python SDK также выбирает объекты для GCC. Незаметной подмены компилятора нет.
Передавайте пути включения, определения макросов и поддерживаемые параметры исходного кода через --compiler-arg или compiler_args SDK. Изменение целевой платформы или режима вывода и токены файлов отклика (@file) отклоняются в любой позиции аргументов, включая отдельные значения параметров. Обычные пути -I и определения -D по-прежнему поддерживаются.
Замените адреса примеров подтверждёнными входами исходных функций. Объявление замены должно совпадать с исходным машинным ABI, включая соглашение о вызовах и размещение структур; адрес этого не доказывает. Для C++ нужны --language=c++ и подходящий Clang++/G++. Используйте вход extern "C" или точное декорированное имя. Дополнительные функции разрешены. --entry и --func явно выбирают замену; прежний --from-c также учитывает адрес.
Можно также явно выбрать artifact="object".
# Clang C -> LLVM IR
neverd patch app --from-source=replacement.c --entry=replacement \
--func=0x401140 --compiler=clang --compiler-path=/path/to/clang \
--patch-report -o app.clang
# NeverC ordinary C -> native object
neverd patch app --from-source=replacement.c --entry=replacement \
--func=0x401140 --compiler=neverc --compiler-path=/path/to/neverc \
--artifact=object --patch-report -o app.neverc
# GCC -> native object (CLI default for GCC)
neverd patch app --from-source=replacement.c --entry=replacement \
--func=0x401140 --compiler=gcc --compiler-path=/path/to/gcc \
--patch-report -o app.gcc
# Independently compiled ELF x64 object
clang --target=x86_64-unknown-linux-gnu -fPIC -fno-lto -c replacement.c -o replacement.o
neverd patch app --from-object=replacement.o --entry=replacement \
--func=0x401140 --patch-report -o app.objectNeverC C и hosted DynCode
NeverC принимает только чистый C для ELF, PE и Mach-O x64/ARM64. NeverD отклоняет NeverC с --language=c++ до запуска компилятора, без неявной трансляции или замены компилятора. Для C++ и исключений используется Clang либо подходящий GCC в проверенном профиле объектов ELF. Hosted-кадры C могут пропускать исключение, создаваемое и перехватываемое окружающей программой C++, благодаря настоящим данным раскрутки; это не означает поддержку C++ в NeverC.
dyncode: --compile-mode=dyncode использует -fdyncode-hosted: исходник, один явный вход, нативный объект и отсутствие исходных привязок. CLI и Python выбирают объект для этого режима и GCC. Перед публикацией проверяются хеши, каждый байт кода и вход; развёртку обеспечивают настоящие CFI/SEH или полные compact-записи. Изменяемое/TLS-состояние, неявные syscall/PEB/heap/string-преобразования, неразрешённые импорты и переставленный код отклоняются. Данные и callback передаются параметрами.
neverd patch app --from-source=replacement.cpp --language=c++ \
--compiler=clang --compiler-path=/path/to/clang++ \
--entry=replacement --func=0x401140 --patch-report -o app.cpp
neverd patch app --from-source=replacement.c --compiler=neverc \
--compiler-path=/path/to/neverc --compile-mode=dyncode \
--entry=replacement --func=0x401140 --patch-report -o app.dyncodeClang LLVM IR поддерживает Windows ARM64 C++ FH3 с проверкой xdata, ABI родительского кадра и групп funclet/FuncInfo. Языковые обработчики объектов пока не поддерживаются. check_source_patch_cpp_runtime.py запускает девять сценариев на нативном Windows x64/ARM64, разделяя CPU и OS-unwinder доказательства.
| Компилятор | Артефакт | Проверенный профиль выполнения ОС |
|---|---|---|
| Clang 22.1.x | LLVM IR | ELF x64/ARM64 C/C++; Mach-O x64/ARM64 C/C++; PE x86/x64/ARM64 C; PE x64/ARM64 C++ FH3; ELF x86 C (compatibility, qemu-user); ELF ARM32 C (ARM/Thumb, compatibility, qemu-user) |
| Clang 22.1.6 | Нативный объект | ELF x64/ARM64 C/C++; PE x86/x64/ARM64 C; Mach-O x64/ARM64 C; ELF x86 C (compatibility, qemu-user); ELF ARM32 C (ARM/Thumb, compatibility, qemu-user) |
| GCC/G++ 13.3.0 | Нативный объект | ELF x64/ARM64 C/C++ с совместимой средой Itanium; ELF x86 C (compatibility, qemu-user); ELF ARM32 C (ARM/Thumb, compatibility, qemu-user) |
| NeverC 3389.1.5 обычный режим | LLVM IR | ELF x64 C; Mach-O x64/ARM64 C |
| NeverC 3389.1.5 обычный режим | Нативный объект | ELF x64 C |
| NeverC 3389.1.5 C | LLVM IR / нативный объект | ELF / PE / Mach-O x64/ARM64: чистый исходный C |
NeverC 3389.1.5 hosted-v1 |
Нативный объект + запечатанная нагрузка | ELF / PE / Mach-O x64/ARM64: исходный C и передача исключений через кадры C |
Таблица описывает проверенные профили ОС, а не гарантии для всех версий и параметров. Нативные установщики ELF, PE и Mach-O принимают все четыре архитектуры. GCC требует подходящий драйвер ELF и не создаёт LLVM IR. Неизвестные релокации, TLS, глобальные конструкторы при загрузке, LTO, символы common/IFUNC и неразрешённые импорты вызывают явную ошибку. JSON-квитанция содержит компилятор, аргументы, привязки и адреса; для нативных объектов также записывается SHA-256.
Поле target в квитанции нативного объекта определяется ABI загруженного образа, включая флаги плавающей точки ARM ELF и различие платформ iOS/watchOS. Скомпилированные и предоставленные объекты используют одно правило идентификации.
Матрица CPU требует успешной установки исходников, внешнего IR и нативных объектов во всех двенадцати комбинациях. Отдельно проверяются ARMv7k watchOS и ARMv7 iOS, изменяемые/константные данные, аргументы с плавающей точкой и в стеке исходных функций, а также вход после изменения адреса загрузки. Исполнение CPU не подтверждает загрузчик ОС, механизм раскрутки C++ или произвольную ABI; используйте профили ОС выше.
| Format | x86 |
x64 |
ARM32 |
ARM64 |
|---|---|---|---|---|
ELF |
CPU |
CPU |
CPU |
CPU |
PE |
CPU |
CPU |
CPU |
CPU |
Mach-O |
CPU |
CPU |
CPU |
CPU |
CPU означает установку исходников/IR/объекта, повторную загрузку и точное исполнение функции. ARM ELF определяет EABI5, режим ARM/Thumb и ABI плавающей точки по образу и регистрирует полный отсортированный индекс EHABI. PE сохраняет строки x64/ARM и базовые релокации HIGHLOW/DIR64/MOV32T; x86 использует код регистрации компилятора. Mach-O различает watchOS DWARF и iOS SjLj по подтипу CPU. Входные переходы ARM/Thumb относительные и выдерживают смену базы.
Нативные объекты используют собственные ограниченные символы функций, вспомогательные/секционные определения и записи раскрутки без вымышленных ID владельцев MC или перекомпиляции IR. Границы функций COFF требуют точных вспомогательных размеров, секций с одной функцией (-ffunction-sections) либо декодированных нативных записей runtime-функций; размер никогда не угадывается по следующему символу. Адаптер watchOS сохраняет кадры листовых функций ради реальных записей. Нативные языковые обработчики COFF/Mach-O не входят в проверенный объектный профиль; для исключений C++ нужен проверенный путь IR. Статические ARM-механизмы с фиксированным реестром exidx, незарегистрированные абсолютные указатели Mach-O и неподдерживаемая память RELRO отклоняются.
Объекты C от GCC также установлены и исполнены на ELF x86, ARM32 и ARM64 через Linux QEMU user mode. Адаптер выбирает ARM/Thumb по образу; записи GNU property выравниваются по ширине указателя ELF.
Привязки именуют внешние объявления: function подтверждает исходную функцию или импортный стаб, data требует записываемой памяти, const — константного объявления IR. Данным объекта нужен ненулевой размер; нельзя пересекать границы хранения или разрешать запись в RELRO. Для вызова сохранённого тела заменяемой функции явно укажите original. Публичная точка входа по-прежнему вызывает замену; сохранённая выполняет перемещённый префикс из целых инструкций и продолжает исходное тело. Исходник, предоставленный IR и нативные объекты используют единый контракт, включая аргументы с плавающей точкой, стековые аргументы и несколько обратных вызовов.
Обратному вызову необходимы подтверждённые границы функции, режим инструкций, продолжение и данные раскрутки стека. Неизвестные инструкции, небезопасные PC-относительные ссылки, переходы внутрь скопированного префикса, неподдерживаемые релокации загрузчика, перекрывающиеся вызовы и немоделируемые прологи с обработчиками отклоняются до публикации. Совпадение объявления с ABI остаётся обязанностью вызывающего. Квитанция записывает сохранённые входы в original_callbacks.
PE32/PE32+ может расширить заполненную таблицу заголовков секций, переместив файловые диапазоны и обновив моделируемые указатели отладки, символов, сертификатов и оверлея с сохранением исходных RVA. Mach-O x64/ARM64 PIE получает место для команд и раскрутки стека проверенным расширением префикса заголовка, если допускают соседняя защита page-zero и конечный сегмент linkedit; исходные адреса кода/данных не меняются. Профиль не требует -Wl,-headerpad,0x400 или соседних свободных страниц раскрутки. Явные ссылки на адрес заголовка, неизвестные команды загрузки, смешанное владение кодом/данными, повреждённые диапазоны и неподдерживаемые размещения отклоняются. Ёмкость заголовков и раскрутки планируется совместно до установки.
Новый код остаётся RX, изменяемое состояние — RW. Явные запросы --dependency добавляют функции/данные через динамические метаданные ELF, дескрипторы импорта/IAT PE или метаданные dylib/bind Mach-O. Сохраняются идентичности, ординалы и версии существующих импортов; ячейки и вызываемые стабы имеют разные роли. Имя/путь библиотеки должно соответствовать загрузчику целевой OS. Пример использует имя разделяемой библиотеки ELF. Отсутствующая библиотека или символ должны вызывать настоящую ошибку загрузчика при исполнении. TLS, IFUNC, новые контракты версий символов, конструкторы при загрузке и немоделируемые релокации не поддерживаются; ELF .data.rel.ro и CET/IBT требуют дополнительных контрактов. В нативных объектах COFF новые импорты функций/данных должны объявляться с __declspec(dllimport), чтобы релокации обозначали IAT. Обычные прямые внешние ссылки отклоняются.
# ELF example: the original target is at 0x401140.
neverd patch app --from-source=replacement.c --entry=replacement --func=0x401140 \
--bind=original:saved_target=0x401140 \
--bind=function:original_helper=0x401190 \
--bind=data:shared_counter=0x404020:4 \
--bind=const:lookup_table=0x402040:64 \
--dependency=function:extra_function=libpatch_extra.so \
--dependency=data:extra_state=libpatch_extra.so \
--patch-report -o app.boundДобавленные в конец структуры параметры зависимостей проверяются по её размеру и применяются к исходникам, предоставленному IR и нативным объектам. Квитанция содержит added_imports; после повторной загрузки кандидата вновь проверяются все обратные вызовы, импорты, права памяти и установленные байты. Ошибка сохраняет вход и любой существующий выходной файл.
Полные примеры для Windows/macOS/Linux содержат исходники программы, замены и библиотеки, команды сборки и настоящий плагин Python SDK внутри хоста NeverD. Запускайте из корня репозитория со сборкой NeverD с Python и новым каталогом вывода.
# Linux / macOS
python3 examples/source-patch/run.py --neverd build-example-host/bin/neverd --clang clang --output build-example-native# Windows: Visual Studio developer PowerShell
python examples/source-patch/run.py --neverd build-example-host/bin/neverd.exe --clang clang --output build-example-nativeПо умолчанию выполняются оба пути; добавьте --api cli или --api sdk для выбора одного. Адрес цели определяется автоматически. Для 7 оригинал выводит 8, обе версии с патчем — 36. Драйвер проверяет выполнение, квитанции и реальные ошибки загрузчика при отсутствии библиотеки; полные команды сохраняются в commands.json.
Примеры CLI и встроенного Python SDK прошли нативную проверку на Linux, macOS и Windows x64/ARM64: 54 запуска и 12 реальных отказов загрузки без библиотеки. CI и точные исходники для каждого хоста.
ELF использует FDE/LSDA компилятора; Mach-O — compact unwind/DWARF. PE x64/ARM64 допускает таблицы FH3 при наличии совместимой исходной среды MSVC и идентичности типов. Данные type-info могут требовать явных привязок. FH4, собственные personality, исходный SEH и активные CFG/EHCont/XFG отклоняются; исходные флаги защиты сохраняются.
Оригиналы ELF x86/x64 с требованиями IBT сейчас отклоняются: установщик исходного кода пока не предоставляет trampoline с сохранением ENDBR.
Сценарии выполнения проверяют обычный возврат, внутренний catch, новое исключение в исходном вызывающем коде, исключение исходной вызываемой функции через замену, очистку RAII ровно один раз, повторный выброс, завершение noexcept и неизменённые функции. Исходная точка вызова уже должна допускать распространение исключений. Патч не восстанавливает catch, удалённые компилятором вокруг функции, доказанно не бросающей исключений.
Добавляемый C API — neverd_patch_source с neverd_source_patch_options_v1; neverd_patch_source_report возвращает квитанцию. Для объектного ввода передаётся длина в байтах. Прежний neverd_patch_from_c остаётся доступным.
Входные данные фиксируются. Кандидат создаётся рядом с целевым файлом, повторно загружается и проверяется для каждого запрошенного входа до исключительной публикации. Существующие файлы и символьные псевдонимы не перезаписываются. Одна отсутствующая привязка отменяет весь запрос. --mode=inplace отклоняется. Преобразования IR сеанса неприменимы к нативным объектам. Mach-O строго проверяет и обновляет подпись; подпись PE не удаляется незаметно.
report = session.patch_source(
replacement_source, "app.patched",
mappings={"replacement": original_address},
compiler="clang", compiler_path="/path/to/clang", artifact="object",
bindings={
"saved_target": ("original", original_address),
"shared_counter": ("data", original_counter_address, 4),
},
dependencies={
"extra_function": ("libpatch_extra.so", "function"),
"extra_state": ("libpatch_extra.so", "data"),
},
)Шесть выбранных нативных OS/ISA-заданий прошли без ошибок и пропусков: 3669 запусков GoogleTest, 1008 наблюдений нативных процессов (504 функциональных и 504 для исключений C++), 12 реальных отказов загрузчика, 96 образов и 84 квитанции публикации.
| Хост | Исходники | Harness | Задание CI | Тесты | Наблюдения / отказы |
|---|---|---|---|---|---|
| Linux x64 | 61fb1d3e759 | 197126208b6 | 116845056048 | 626 | 168 / 2 |
| Linux ARM64 | 61fb1d3e759 | 197126208b6 | 116845055863 | 600 | 168 / 2 |
| macOS Intel | b7a180c7ac3 | cba0906a114 | 117185095063 | 624 | 168 / 2 |
| macOS ARM64 | 61fb1d3e759 | f6311a611e0 | 116879179194 | 624 | 168 / 2 |
| Windows x64 | 76ce83e138d | a42b117681f | 116908799030 | 598 | 168 / 2 |
| Windows ARM64 | 76ce83e138d | cba0906a114 | 117014878954 | 597 | 168 / 2 |
Артефакты подтверждают ровно указанные ниже коммиты исходников и harness. Последующие коммиты интеграции dev и документации имеют отдельные локальные и документальные проверки. Прежние ошибки и отмены остаются неуспехами. Исторические 216 дополнительных наблюдений, PE ARM32 и старые 32-битные Apple CPU/совместимые среды не доказывают новое покрытие нативного оборудования или исключений C++.
Квалификация Windows ARM64 использует нативную C DLL Unicorn ARM64, реально собранную из закреплённого подмодуля проверенным LLVM-MinGW, библиотеку импорта MSVC и явную подмену цели CMake. Изолированная сборочная копия подтверждает три исправления хоста: пару переходов без SEH, ARM64-обработчик выделения страниц с синхронизацией кэша инструкций и 64-битные маски непосредственных значений для Windows LLP64. Исходники и ревизия подмодуля неизменны. Это подтверждает пригодность тестового хоста для CPU-матрицы, но не штатную поддержку JIT MSVC ARM64. Пять проверок восстановления хоста учитываются отдельно от нативного выполнения патченных процессов и исключений C++.
Выберите совместимый компилятор через NEVERD_SOURCE_PATCH_TEST_CLANG_EXECUTABLE (проверен Clang 22.1.6). Интегрированная сборка напрямую компилирует записанную ревизию форка LLVM NeverSight. Исправления релокации находятся в форке; NeverD не применяет патчи к исходникам LLVM. Ошибка x64 PLT в пакетах r3/r4 может привести к отказу IR-патча; нативные объекты обходят этот путь MC. NEVERD_TEST_REQUIRE_FIXED_LLVM=1 требует точной исправленной генерации PLT.
NeverDSourcePatchTests содержит нативные случаи C/API/объектов/исключений; NeverDSourcePatchMatrixTests проверяет все комбинации в Unicorn. SourcePatchPE выполняет семь C++-сценариев при заданных NEVERD_TEST_WINDOWS_CRT_LIB, NEVERD_TEST_WINDOWS_UCRT_LIB и NEVERD_TEST_WINDOWS_SDK_LIB. Вне Windows также нужен NEVERD_TEST_WINDOWS_RUNNER. NEVERD_TEST_REQUIRE_WINDOWS_RUNTIME=1 делает отсутствие входов ошибкой. Отдельный Windows workflow требует нативное выполнение и не принимает пропуски.
Linux на Mac разработчика проверяется через Docker с явным загрузчиком Linux; PE — через Wine 11. Mach-O ARM64 выполняется на самом Mac. Результаты нативного Windows CI проверяются отдельно: настроенное задание не означает успешный запуск. Исторические числа, исходные ошибки и ограничения эмуляторов приведены в подробных контрактах и журнале проверки.
cmake -S . -B build-source -G Ninja -DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTING=ON -DNEVERD_LLVM_PREBUILT=OFF \
-DNEVERD_ENABLE_SEMANTIC_TESTS=ON \
-DNEVERD_SOURCE_PATCH_TEST_CLANG_EXECUTABLE=/path/to/clang
cmake --build build-source --target NeverDSourcePatchTests \
NeverDSourcePatchMatrixTests --parallel 4
ctest --test-dir build-source -L \
'^(NeverDSourcePatchTests|NeverDSourcePatchMatrixTests)$' \
--output-on-failure --parallel 4Форк LLVM также исправляет GOT-ссылки на данные Mach-O x64: таблица типизированного catch Clang отсчитывается от конца четырёхбайтового поля релокации. r3/r4 сдвигает её на четыре байта; проверка перед публикацией отклоняет такой результат. На Mac x64 работает через Rosetta 2, ARM64 — напрямую.
При проверке в нативной среде Windows x64 2ed7e78fc успешно выполнены все 16 специализированных тестов PE/объектов/trampoline и все 143 теста CPU-матрицы целей, без пропусков. Тест FH3 выполнил семь сценариев C++; матрица использует Unicorn. Использованы Clang 22.1.6, нативные MSVC и Windows SDK, а также интегрированный LLVM.
Рабочий процесс Windows также создаёт 27 замен PE для x86, x64 и ARM64. scripts/check_source_patch_pe_runtime.py проверяет нелистовые вызовы, изменяемое состояние указателей, аргументы с плавающей точкой и стековые аргументы через исходный IR, скомпилированные и предоставленные объекты. Каждый оригинал и результат запускается трижды: по 30 наблюдений процессов на архитектуру. x86/x64 запускаются в Windows x64, ARM64 — на windows-11-arm. Проверка требует ожидаемый нативный хост, совпадение коммита и хешей файлов, а также полный набор случаев; внешние среды выполнения отмечаются отдельно. Этот профиль не подтверждает поддержку исключений C++ на ARM64.
NEVERD_TEST_MATRIX_NEVERC выбирает дополнительный компилятор матрицы. NeverC 3389.1.5 прошёл все 66 проверок x64/ARM64 для ELF, PE и Mach-O, включая установку IR и нативных объектов и выполнение на CPU. Эта версия не поддерживает x86 и ARM32; используйте для них Clang, а для ELF также подходит соответствующий драйвер GCC. При компиляции PE через NeverC адаптер добавляет -fno-autolink: ссылки разрешаются в существующем образе без подключения другой CRT. Предоставленные объекты с контрактами компоновщика .drectve по-прежнему отклоняются.
Проверка нативных процессов Windows a4a5ae3cb успешно завершила все 90 наблюдений: по 30 для x86, x64 и ARM64 через исходный IR, скомпилированные и предоставленные объекты. x86/x64 выполнялись в Windows x64, а ARM64 — на windows-11-arm с теми же образами, проверенными по хешам. В этом же запуске успешно выполнены все 16 специализированных проверок PE/объектов/trampoline и все 143 проверки матрицы Unicorn, без пропусков. Тест FH3 сохранил семь сценариев выполнения C++ x64.
Нативная квалификация фиксирует NeverC 182fd2c5dc, независимые исходные программы и текущий установщик NeverD. check_source_patch_hosted_pe_runtime.py требует 36 наблюдений для каждой архитектуры Windows: C IR/объекты/hosted и раскрутка двух кадров C. check_source_patch_elf_runtime.py требует 120 наблюдений для каждой архитектуры Linux: C, hosted-передача и девять сценариев исключений Clang C++. Квитанции, хеши и реальная архитектура должны совпадать; запуск самого NeverC на CI-хосте этим не подтверждается. В Linux x64 и ARM64 девять сценариев проверяются отдельно для IR Clang, нативных объектов Clang и нативных объектов GCC. NeverC по-прежнему принимает только C.
204 наблюдения прежнего профиля трансляции остаются историческими и не подтверждают текущий контракт чистого C. Все три текущих пути NeverC используют C; Clang C++ FH3 проверяется отдельно. На Mac разработчика с Apple Silicon macOS x64 использует Rosetta 2. Unicorn/QEMU не заменяют нативную проверку ОС и механизма раскрутки.
Перемещения инструкций AArch64 требуют явных слагаемых RELA. Неявные слагаемые REL для инструкций отклоняются до публикации; битовые поля инструкций не трактуются как обычные данные. Поддерживаемые перемещения данных PREL64 сохраняют полные знаковые слагаемые и в REL, и в RELA.
Проверка производителя C cc91afb3b прошла все 312 наблюдений нативных процессов: по 36 на Windows x64 и ARM64 и по 120 на Linux x64 и ARM64. Linux отдельно проверяет девять сценариев исключений для IR Clang, нативных объектов Clang и нативных объектов GCC; все входы NeverC для IR, объектов и hosted DynCode написаны на C.
Проверка пересобранного установщика cc91afb3b прошла 19 проверок PE/объектов, все 143 случая CPU-матрицы и 474 наблюдения нативных процессов Windows/Linux. Процессы Windows x86 выполнялись на Windows x64; x64 и ARM64 использовали соответствующие хосты. Отдельная проверка Linux прошла исходные 108 случаев, ещё три проверки LLVM-C и три Clang/GCC C++, без ошибок и пропусков.
Интеграционная проверка 0a6f6d768 повторно подтвердила все 312 наблюдений процессов на нативных Windows/Linux x64 и ARM64. Все 30 итоговых образов побайтно совпадают с ранее проверенными; хеши исходников и квитанции публикации только C обновлены и независимо проверены.
Расширенная проверка Linux на 0a6f6d768 выполнила 429 проверок без ошибок и пропусков: исходные 108 случаев, 55 полных проверок Swift, 143 проверки целей CPU, 117 нативных сессионных проверок, три LLVM-C и три Clang/GCC C++. Полный локальный набор бинарных патчей на этой интеграции также прошёл все 22 961 случаев. Число нативных процессов и покрытие эмуляцией CPU учитываются отдельно.
Проверка заново собранного установщика Windows на 0a6f6d768 успешно завершила все 182 целевые проверки и 474 запуска нативных процессов без ошибок и пропусков. Независимый аудит артефактов проверил хеш каждого образа, архитектуру, сценарий и число повторений. После интеграции изменений ABI и раскрутки стека на e1cac949f полный набор тестов бинарных патчей вновь прошёл все 22,961 случая без ошибок и пропусков. NeverC по-прежнему поддерживает только чистый C; для замен на C++ используются Clang/GCC.
Процессный workflow требует нативного выполнения на macOS ARM64 (macos-15) и Intel x64 (macos-15-intel). Для каждой архитектуры выполняются 96 наблюдений: исходники и объекты Clang C, изменяемое состояние через указатели, вещественные и стековые аргументы, девять сценариев исключений Clang C++ и существующие IR/объектные/hosted-выходы NeverC для чистого C. Подписи Mach-O строго проверяются перед запуском; установленный hosted-код должен побайтно совпадать с выходной нагрузкой компилятора.
Тот же workflow требует 30 наблюдений Windows x86 на Windows x64, 48 Linux x86 на Linux x64 и 96 Linux ARM32 через QEMU user mode, поровну для ARM и Thumb. Проверки Linux включают подходящие GCC-объекты. Каждый сценарий повторяется трижды. Отчёты различают native, compatibility, rosetta и qemu-user и сохраняют целевую и фактическую хостовую архитектуры. Rosetta не выполняет требование нативного Intel-хоста.
Все 14 профилей CPU по-прежнему покрыты матрицей из 283 проверок исходников/IR/объектов. PE ARM32, Mach-O i386, ARMv7 iOS и ARMv7k watchOS сейчас имеют CPU-проверку без заявления о нативном загрузчике OS или C++-размотке. NeverC остаётся компилятором чистого C для x64/ARM64; 32-битные выходы создают Clang и соответствующие ELF-драйверы GCC. Проверяющий скрипт не собирает и не изменяет NeverC.
Windows x64 и ARM64 также выполняют по 36 наблюдений Clang C++ FH3.
Изменяемые указатели Mach-O инициализируются во время выполнения; статические адресные инициализаторы по-прежнему требуют неподдерживаемой регистрации загрузочных релокаций и проверяются явным тестом отказа. COMDAT-функции ELF нулевого размера допускаются только когда сигнатура является единственной функцией в начале исполняемой секции, а CFI точно покрывает всю секцию. Внутренние смещения, общие секции, заполнение, отсутствие группы или CFI остаются запрещены.
ELF ARM и Thumb имеют отдельные профили. Производители явно получают -marm или -mthumb, а нативные привязки сохраняют исходный бит состояния инструкций. 32-битные ELF-процессы используют PIE с настоящими динамическими релокациями. ARM32 QEMU сохраняет явный glibc --loader и sysroot: его расчёт AUXV не обрабатывает перенесённые заголовки программы так же, как ядро Linux. Этот путь проверяет загрузку glibc и выполнение под QEMU, но не физический ARM32 или нативный загрузчик ядра.
Для этих ELF-образов с патчами пути qemu-user для Linux x86 и ARM32 требуют явного glibc --loader из sysroot, соответствующего целевой архитектуре. Linux x86 в режиме compatibility использует 32-битную совместимость ядра хоста Linux x64 и учитывается отдельно от выполнения QEMU; это не подтверждает выполнение на нативном 32-битном хосте x86.
Проверка процессов для fcee81c9a5e2f20a71090ade23ae833175f64c59 успешно выполнила все 750 наблюдений: 576 на нативных хостах соответствующей архитектуры, 78 в режиме совместимости x86 и 96 для ARM/Thumb через пользовательский режим QEMU. Независимый аудит сверил хеши всех 126 образов, среды выполнения и полный перечень сценариев. Пересборка Windows прошла 194 целевые проверки и 474 наблюдения процессов Windows/Linux. Пересборка Linux прошла 444 проверки, включая все исходные 62 ошибки и 46 пропусков, без ошибок и пропущенных тестов. Указанные выше ограничения аппаратной проверки и загрузчиков сохраняются. NeverC по-прежнему поддерживает только чистый C; его репозиторий не изменялся.
Дополнительная проверка ARM/Thumb успешно выполнила все 96 наблюдений (48 ARM и 48 Thumb) для 32 тестовых образов C из fcee81c9a5e2f20a71090ade23ae833175f64c59 на ubuntu-24.04-arm. Ядро Linux загружало каждый образ напрямую через /lib/ld-linux-armhf.so.3, без QEMU и явной команды загрузчика. Это режим compatibility на хосте ARM64, а не проверка на нативном 32-битном хосте. Коммит тестовой программы 3ad17ac9608d6bd9f5a4d44953ec375524e5730b и коммит образов записаны отдельно. Независимый аудит артефактов проверил хеши образов, все 30 квитанций публикации, полный набор сценариев и повторений, а также отсутствие соответствующих правил интерпретатора binfmt_misc.
Отдельные проверки облачных раннеров показали, что предоставленный раннер Windows 11 ARM64 отклоняет программы ARM32 с WinError 216. В среде macOS 15.7.9 с Xcode 16.4 доступные SDK не смогли скомпоновать программы macOS i386 и iOS ARMv7. Программа watchOS ARMv7k была успешно скомпонована, но выполнение на физическом устройстве не подтверждено. Успешное завершение диагностических заданий не означает прохождения проверки этими платформами; нативное аппаратное покрытие остаётся неполным. NeverC не собирался и не изменялся.
Дополнительные проверки Linux в личном Actions успешно выполнили 96 запусков ARM/Thumb в полноценной гостевой системе ARM32 под QEMU TCG с 32-битным ядром Linux и glibc, а также 30 запусков PE ARM32 через Wine в той же системе. Гостевое ядро загружает ELF-образы напрямую. Эта системная эмуляция учитывается отдельно от пути qemu-user с явно указанным загрузчиком. Установка реестра Wine в слое совместимости хоста ARM64 записывается отдельно и не учитывается как запуск патча. Инициализация Wine в гостевой системе и каждый измеряемый запуск должны завершиться успешно в пределах исходных сроков.
Проверки совместимости Apple успешно выполнили 30 запусков Mach-O i386 через Darling в Linux и 60 запусков ARMv7/ARMv7k через touchHLE в Intel macOS. Каждый оригинал и каждая замена из исходного IR, скомпилированного или предоставленного объектного файла запускаются трижды. Независимый аудит проверил все 72 образа, 66 отчётов о публикации патчей и 216 запусков этих дополнительных проверок, включая размеры артефактов GitHub, SHA256, точные коммиты и полные списки случаев. Входы Linux по-прежнему закреплены за fcee81c9a5; входы PE созданы на a542f97ba, Mach-O — на 8f5f06762. Коммиты тестовых скриптов записаны отдельно в связанных запусках.
Исправления Mach-O подтверждают режим выбранных Thumb-функций независимо от смешанного ARM/Thumb-режима всего образа, нормализуют подтверждённые указатели экспорта Thumb и адреса кода раскрутки стека ARM32, не изменяя указатели данных и длины диапазонов. Сборка с интегрированными исходниками LLVM локально прошла все 283 проверки CPU-матрицы и 258 проверок контрактов исключений без ошибок и пропусков. Старые Mach-O-пробы используют документированный открытый компоновщик и резервируют место для метаданных раскрутки; i386 имеет правильно выровненную стартовую точку и сегмент нулевой страницы размером 64 KiB.
Эти результаты подтверждают выполнение C в указанных эмуляторах и слоях совместимости. Wine не является Microsoft Windows, Darling не является macOS, а выполнение ARMv7k в iOS HLE не подтверждает watchOS, WatchKit или устройства Apple. Из этого не следует покрытие старых Apple SDK или нативного 32-битного оборудования; эти пробы также не подтверждают раскрутку исключений C++. Предыдущие нативные проверки и проверки совместимости учитываются отдельно. NeverC не собирался и не изменялся.
lib/patch отвечает за проверку байтов, кодирование LLVM MC, неизменяемый снимок входа, нормализованные изменения и исключительную публикацию. SDK проверяет цели по точному тексту C, каноническим источникам LowIR и декодированным операндам; одной навигационной привязки недостаточно. Worker включает необязательный patches.json в отмену и повтор и сбрасывает анализ после изменений. Сигнатуры читают исходные байты; изменённые функции теряют библиотечные эффекты, выведенные из их идентичности. GUI, CLI и Python используют единые API. Полная замена по-прежнему использует neverd_patch_source; байтовые изменения сначала нужно экспортировать и открыть заново.
GUI · neverd patch-bytes · Session.byte_patches · Session.apply_byte_patch · Session.export_byte_patches