分析nuitka为何在win7上以onefile模式打包无法运行
2022-12-07 本文已影响0人
超哥__
用nuitka不久,这个打包工具确实是很好的工具
环境: Win7_x64 / nuitka1.2.x / Python3.7
# helloworld.py
print("helloword")
python -m nuitka --onefile --mingw64 helloworld.py
打包后产生helloworld.build / helloworld.dist / helloworld.onefile-build /helloworld.exe
现象:
运行后直接弹窗报错"helloworld.exe"已停止工作,而运行helloworld.dist/helloworld.exe却正常执行。
一开始是怀疑缺少dll,但是把这个独立的helloworldexe放到helloworld.dist中执行,仍然报错。因此怀疑是one打包的问题。
再次怀疑是mingw版本和win7不兼容?因此尝试切换到mingw64低版本结果依然。
最后拿windbg调试,发现WriteFile函数使用错误,详见
https://learn.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-writefile
因此gitclone下载nuitka源码做如下修改
// HelpersFilesystemPaths.c
bool writeFileChunk(FILE_HANDLE target_file, void *chunk, size_t chunk_size) {
#if defined(_WIN32)
return WriteFile(target_file, chunk, (DWORD)chunk_size, NULL, NULL);
#else
size_t written = fwrite(chunk, 1, chunk_size, target_file);
return written == chunk_size;
#endif
}
// HelpersFilesystemPaths.c
bool writeFileChunk(FILE_HANDLE target_file, void *chunk, size_t chunk_size) {
#if defined(_WIN32)
DWORD writesize = 0;
return WriteFile(target_file, chunk, (DWORD)chunk_size, &writesize, NULL);
#else
size_t written = fwrite(chunk, 1, chunk_size, target_file);
return written == chunk_size;
#endif
}
再次打包,成功执行 helloworld程序