jako myslis tu glibc? nic jinyho by tam snad uz nemelo byt
v clanku je
linux-vdso.so.1 (0x00007ffd1dbe5000) libc.so.6 => /lib64/libc.so.6 (0x00007f8a23d29000) /lib64/ld-linux-x86-64.so.2 (0x00007f8a23f1d000)
to prvni ani nevim co je ;) ale libc.so.6 je dobre na hodne dlouho ne?
23. 5. 2024, 10:13 editováno autorem komentáře
Glibc má verzované i symboly, takže binárka sestavené na systému s novější libc typicky nepoběží na systému se starší libc, protože při linkování se volí nejnovější verze symbolů. Opačným směrem to typicky jde.
Proto se např. python wheels buildí v docker image manylinux, což je nějaký starší systém, a tím je zajištěna kompatibilita s běžnými novějšímy systémy. (Taktéž obsahuje několik verzí pythonu, takže je možné rovnou sestavit wheels pro více verzí.)
Podobné to bude v případě dynamicky linkovaných rust a golang binárek.
Nicméně v případě golangu jsem za celou dobu (cca 6 let) nepotřeboval dynamicky linkovat s nějakou "nenativní" knihovnou - vždy jsem použil čistě golang závislosti. Potom je možné triviálně sestavit statickou binárku, která je dobře přenositelná (konkrétně k běhu potřebuje pouze kernel verze 2.6.32 a vyšší). Viz. Go Wiki: Minimum Requirements.
Sestavení statické binárky si lze vynutit nastavením proměnné prostředí:
$ CGO_ENABLED=0 go build -o ??? .
V rustu lze taky sestavit statickou binárku, ale celá situace je trochu komplikovanější. V rustu je častější mít závislosti na systémových knihovnách. Např. použiju http klienta reqwest a s tím si (by default) zavleču závislost na systémovém openssl. Na debianu je openssl distribuované i ve statické verzi, takže to je ok, ale na archu např. ne. Pak je občas u bindingů na c/c++ knihovny feature flag na kompilaci verze přibalené v rust crate - tím může být relativně jednoduché obejít případy, kdy statická verze knihovny na build systému dostupná není. Nebo např. u balíku reqwest je feature flag na použití rust-only implementace tls. Ale stejný feature flag by pak samozřejmě musely mít i všechny ostatní balíky používající tls.
Sestavit statickou binárku v rustu pak jde takto:
$ RUSTFLAGS='-C target-feature=+crt-static' cargo build --release --target x86_64-unknown-linux-gnu
V případě debianu je glibc nastavené na podporu kernelů od verze 3.2. Takže předpokládám, že to by byl požadavek na běhové prostředí výsledné binárky.
S tím "Treba pro in-house programky, ktery se maji sirit po firme, to neni vubec marny." jsme u nás s Windows narazili. Zatímco zdrojové kódy si můžeme stáhnou a spustit v pythonu, node.js apod., tak zkompilovaný .exe spustit nelze. Není podepsaný. Snadnou cestu ven jsme nenašli, končilo to tím, že si každý ten .exe musel zkompilovat a podepsat sám na svém PC. Což tak nějak negovalo původní záměr.
Má s tímhle někdo nějaké zkušenosti, prosím? Jak si zkompilovat python program do .exe a to spustit na jiném PC, kde jsou Windows 10, které nedovolí nic, co nemá platný certifikát? Výjimku udělit nelze. Vlastní certifikát vytvořit lze a na PC je i akceptovaný. Ale jakákoliv snaha zkopírovat ho do jiného PC jako platný selhává.
Takze ste uplne rezignovali na akukolvek bezpenost vo firme? A spustite vsteko vsade a este k tomu skripty?
A pritom codesigning certifikaty nie su extra drahe. Alebo sa da vydat vlastny, ale k tomu treba distribuovat Trusted root certifikat a nie koncovy. navyse binarky nesmu podpisovat ludia, ale to ma robit CI/CD v bezpenosm prostredi.
To už tak bývá. Nechci zacházet do detailů, ale ve chvíli, kdy chcete po někom, aby programoval, tak mu musíte dovolit, aby programoval. Sice jsem si všiml několika projektů o tom, jak být schopen programovat v Pythonu bez toho, že bych měl nainstalovaný Python nebo jakékoliv IDE, ale zatím to moc nefungovalo.
Idea, že mám otevřenou webovou stránku, kde upravuji program a po stisku tlačítka se to přes CD/CI nějak spustí a výsledky dostanu, vypadá na první pohled fajn. Jenže já zatím neumím fungovat bez toho, abych si občas ten interpreter spustil.
Ještě mi tedy vrtá hlavou to, jak to souvisí s firmou. Že má uživatel PC možnost si nainstalovat a spouštět Python, node.js, nějaké IDE nebo rovnou MS VisualStudio, jak přesně tohle znamená "rezignovali na jakoukoliv bezpečnost ve firmě"?
Numba teda překvapila, myslel jsem, že Nuitka bude nejrychlejší.
Jsem zvědav, zda se objeví parta, že to nebude používat kvůli ruskému jménu, protože Nuitka je podle ruské manželky programátora
https://x.com/KayHayen/status/1028940741047930880
Hmm, ať dělám, co dělám, numpy nedokážu zkompilovat.
~/prog-p/bench2 $ make # Kompilace skriptu pomocí Nuitka python -m nuitka --standalone --onefile --enable-plugin=numpy bench.py Nuitka-Options: Used command line options: --standalone --onefile --enable-plugin=numpy bench.py Nuitka-Plugins:WARNING: numpy: This plugin has been deprecated, do not enable it anymore. Nuitka: Starting Python compilation with Nuitka '2.2.3' on Python '3.11' commercial grade 'not installed'. Nuitka-Plugins:anti-bloat: Not including '_bisect' automatically in order to avoid bloat, but this may cause: may slow down by using fallback implementation. Nuitka-Plugins:anti-bloat: Not including '_json' automatically in order to avoid bloat, but this may cause: may slow down by using fallback implementation. Nuitka: Completed Python level compilation and optimization. Nuitka: Generating source code for C backend compiler. Nuitka: Running data composer tool for optimal constant value handling. Nuitka: Running C compilation via Scons. Nuitka-Scons: Backend C compiler: clang (clang 18.1.6). Nuitka-Scons: Inherited CFLAGS='--target=aarch64-linux-android24' variable. Nuitka-Scons: Scons: Inherited LDFLAGS='--target=aarch64-linux-android24' variable. Nuitka-Scons: Backend linking program with 117 files (no progress information available for this stage). Nuitka-Scons: Compiled 116 C files using ccache. Nuitka-Scons: Cached C files (using ccache) with result 'cache hit': 116 Nuitka-Postprocessing: Creating single file from dist folder, this may take a while. Nuitka-Onefile: Running bootstrap binary compilation via Scons. Nuitka-Scons: Onefile C compiler: clang (clang 18.1.6). Nuitka-Scons: Inherited CFLAGS='--target=aarch64-linux-android24' variable. Nuitka-Scons: Scons: Inherited LDFLAGS='--target=aarch64-linux-android24' variable. Nuitka-Scons: Onefile linking program with 1 files (no progress information available for this stage). Nuitka-Scons: Compiled 1 C files using ccache. Nuitka-Scons: Cached C files (using ccache) with result 'cache hit': 1 Nuitka-Onefile: Using compression for onefile payload. Nuitka-Onefile: Onefile payload compression ratio (26.35%) size 41350398 to 10896160. Nuitka-Onefile: Keeping onefile build directory 'bench.onefile-build'. Nuitka: Keeping dist folder 'bench.dist' for inspection, no need to use it. Nuitka: Keeping build directory 'bench.build'. Nuitka: Successfully created 'bench.bin'. # Spuštění binárního souboru ./bench.bin Traceback (most recent call last): File "/data/data/com.termux/files/usr/tmp/onefile_30658_1716468864_501654/numpy/__init__.py", line 130, in <module numpy> File "/data/data/com.termux/files/usr/tmp/onefile_30658_1716468864_501654/numpy/__config__.py", line 4, in <module numpy.__config__> File "/data/data/com.termux/files/usr/tmp/onefile_30658_1716468864_501654/numpy/core/__init__.py", line 24, in <module numpy.core> File "/data/data/com.termux/files/usr/tmp/onefile_30658_1716468864_501654/numpy/core/multiarray.py", line 10, in <module numpy.core.multiarray> File "/data/data/com.termux/files/usr/tmp/onefile_30658_1716468864_501654/numpy/core/overrides.py", line 8, in <module numpy.core.overrides> ImportError: dlopen failed: library "libopenblas.so" not found: needed by /data/data/com.termux/files/usr/tmp/onefile_30658_1716468864_501654/numpy/core/_multiarray_umath.so in namespace (default) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/data/data/com.termux/files/usr/tmp/onefile_30658_1716468864_501654/bench.py", line 2, in <module> import numpy as np File "/data/data/com.termux/files/usr/tmp/onefile_30658_1716468864_501654/numpy/__init__.py", line 135, in <module numpy> ImportError: Error importing numpy: you should not try to import numpy from its source directory; please exit the numpy source tree, and relaunch your python interpreter from there. make: *** [Makefile:13: run] Error 1
me to jde:
$ python -m nuitka --standalone --onefile harmonic_fp16.py Nuitka-Options: Used command line options: --standalone --onefile harmonic_fp16.py Nuitka: Starting Python compilation with Nuitka '2.2.3' on Python '3.11' commercial grade 'not installed'. Nuitka-Plugins:anti-bloat: Not including '_bisect' automatically in order to avoid bloat, but this may cause: may slow down by using Nuitka-Plugins:anti-bloat: fallback implementation. Nuitka-Plugins:anti-bloat: Not including '_json' automatically in order to avoid bloat, but this may cause: may slow down by using Nuitka-Plugins:anti-bloat: fallback implementation. Nuitka: Completed Python level compilation and optimization. Nuitka: Generating source code for C backend compiler. Nuitka: Running data composer tool for optimal constant value handling. Nuitka: Running C compilation via Scons. Nuitka-Scons: Backend C compiler: gcc (gcc 13). Nuitka-Scons: Backend linking program with 118 files (no progress information available for this stage). Nuitka-Scons:WARNING: You are not using ccache, re-compilation of identical code will be slower than necessary. Use your OS package Nuitka-Scons:WARNING: manager to install it. Nuitka-Postprocessing: Creating single file from dist folder, this may take a while. Nuitka-Onefile: Running bootstrap binary compilation via Scons. Nuitka-Scons: Onefile C compiler: gcc (gcc 13). Nuitka-Scons: Onefile linking program with 1 files (no progress information available for this stage). Nuitka-Scons:WARNING: You are not using ccache, re-compilation of identical code will be slower than necessary. Use your OS package Nuitka-Scons:WARNING: manager to install it. Nuitka-Onefile: Using compression for onefile payload. Nuitka-Onefile: Onefile payload compression ratio (20.80%) size 88835015 to 18478682. Nuitka-Onefile: Keeping onefile build directory 'harmonic_fp16.onefile-build'. Nuitka: Keeping dist folder 'harmonic_fp16.dist' for inspection, no need to use it. Nuitka: Keeping build directory 'harmonic_fp16.build'. Nuitka: Successfully created 'harmonic_fp16.bin
vysledek ma nejakych 18MB, to je podezrele malo :)