From 8ba1b0169826106ba0a1f5bdf6fa91f2958f49db Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Sun, 23 Aug 2026 12:30:11 -0700 Subject: [PATCH] [pylauncher] Add VERSIONINFO resource file for Windows launcher Add `tools/pylauncher/pylauncher.rc` containing a `VERSIONINFO` resource with metadata (file description, version, copyright, company) and update `build.bat` to compile it with `rc.exe` and link it into `pylauncher.exe`. This helps properly identify the executable in Windows and reduces generic heuristic false positive detections from antivirus scanners. --- .gitignore | 1 + tools/pylauncher/build.bat | 3 +- tools/pylauncher/pylauncher-arm64.exe | Bin 6144 -> 7168 bytes tools/pylauncher/pylauncher.exe | Bin 5632 -> 6656 bytes tools/pylauncher/pylauncher.rc | 40 ++++++++++++++++++++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 tools/pylauncher/pylauncher.rc diff --git a/.gitignore b/.gitignore index af0d2a31d6f33..c9e8e3308ffbd 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ coverage.xml !/tools/run_python_compiler.ps1 /tools/pylauncher/*.obj +/tools/pylauncher/*.res # Shell scripts (created by ./tools/maint/create_entry_points.py) em++ diff --git a/tools/pylauncher/build.bat b/tools/pylauncher/build.bat index e204c642c7a33..fd8b5dc8b0df0 100644 --- a/tools/pylauncher/build.bat +++ b/tools/pylauncher/build.bat @@ -19,4 +19,5 @@ if /i "%~1"=="arm64" ( set MACHINE=ARM64 ) -cl pylauncher.c /Fe:%OUT% /O1 /GS- /link /NODEFAULTLIB /ENTRY:launcher_main /SUBSYSTEM:CONSOLE /MACHINE:%MACHINE% /Brepro ucrt.lib kernel32.lib +rc /nologo /fo pylauncher.res pylauncher.rc +cl pylauncher.c pylauncher.res /Fe:%OUT% /O1 /GS- /link /NODEFAULTLIB /ENTRY:launcher_main /SUBSYSTEM:CONSOLE /MACHINE:%MACHINE% /Brepro ucrt.lib kernel32.lib diff --git a/tools/pylauncher/pylauncher-arm64.exe b/tools/pylauncher/pylauncher-arm64.exe index 88f4b2b87dafdf37dae953cd6d8736bc9bb4b675..cdac7caa65afddb94387a7aa8e8f897f3e799ab1 100644 GIT binary patch delta 1952 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 MF8etP{7&pDs- z<(_x%>FdtQouzx1NCW$pE(^af6bLUpR#-Z@YTX58)vzlEdrB7wzM#|v?7647Y>B{m z0#`S0Y~ne@cF|aS}U#6ew2zOt2V>*%<*p1T1ktVs`gu|B(t{2GF$ppYqZpc zk6H+!kx$+0AA6)PR#U&Gq0#%Gx8B>}ZKUcJ=Lp?3rlYdY6Q!!{bF|jjIZsO&Y0ou9FnNRUTNxiV$__} zLp&l9odI3+wHd;L@@h3|cWtC4;aXt8BZwcabd3309E(6Q}&aS}Lz0sVQ- zD1G8Q;(9Zz)S%fB!bkGyEHP;L7@ozT^yPmt*84l=k;xmw@Sz5ipM=5(`Nb}^u1Ps_ z?XXH`b=G%**iDsl*A63jAy3XgGF5%MeV#$uS?i=?D_<94xLM;F^mlG?R&n93g(%@7 zpUK~3@*Y~sn4F7^#O>f!uamIY9v3v8x*&|BZowA%*SJ4iP++%LImcub>D-`d{bnY= zX;@7DAf>&=KhtqWUOk1q77MX zQn7Z)dUx%Yh-9ulA$eWq>JoB;koO505b{nT9};q#kdF$vK2tkpIu<@qg5B_ZZ{VRK4)Oe!07RjjFYB{$?q_JWn>I1QHaG2Jd-|rp@sM>zBRZZw87cd))stXGxy?CT>~g@N7^p?OnC^N#J`?O z?ulye+C9#EXxjsGezII|&OGEPdVk{d*0;_)x1^{4X!Y9%W2;7ZlUj*memFOS#Ut_fVz6fOqt0JzpE+!b)$ z;CS~K&(!k=zt8-A^YZ?O6O%pHjDJ-3{v2!3ZFuJ(ZodmF8#@2PK9NI633QIrWgLU+ J_+2@}(%)}dI$r<) diff --git a/tools/pylauncher/pylauncher.rc b/tools/pylauncher/pylauncher.rc new file mode 100644 index 0000000000000..ef6d25441a4e0 --- /dev/null +++ b/tools/pylauncher/pylauncher.rc @@ -0,0 +1,40 @@ +#include + +#define VER_FILEVERSION 1,0,0,0 +#define VER_FILEVERSION_STR "1.0.0.0" + +#define VER_PRODUCTVERSION 1,0,0,0 +#define VER_PRODUCTVERSION_STR "1.0.0.0" + +1 VERSIONINFO +FILEVERSION VER_FILEVERSION +PRODUCTVERSION VER_PRODUCTVERSION +FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG +FILEFLAGS VS_FF_DEBUG +#else +FILEFLAGS 0x0L +#endif +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_APP +FILESUBTYPE VFT2_UNKNOWN +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "The Emscripten Authors" + VALUE "FileDescription", "Emscripten Python Launcher" + VALUE "FileVersion", VER_FILEVERSION_STR + VALUE "InternalName", "pylauncher" + VALUE "LegalCopyright", "Copyright (c) The Emscripten Authors" + VALUE "OriginalFilename", "pylauncher.exe" + VALUE "ProductName", "Emscripten" + VALUE "ProductVersion", VER_PRODUCTVERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1200 + END +END