Vláda Spojených států získala desetiprocentní podíl v americkém výrobci čipů Intel. Oznámili to podle agentur americký prezident Donald Trump a ministr obchodu Howard Lutnick. Společnost Intel uvedla, že výměnou za desetiprocentní podíl obdrží státní dotace v hodnotě 8,9 miliardy dolarů (zhruba 186 miliard Kč). Částka podle Intelu zahrnuje dříve přislíbené subvence 5,7 miliardy dolarů z programu CHIPS na podporu výroby čipů v USA,
… více »Organizace Apache Software Foundation (ASF) vydala verzi 27 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.
Knihovna FFmpeg byla vydána ve verzi 8.0 „Huffman“. Přibyla mj. podpora hardwarově akcelerovaného kódování s využitím API Vulcan, viz seznam změn.
Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) vydal Zprávu o stavu kybernetické bezpečnosti ČR za rok 2024 (pdf). V loňském roce NÚKIB evidoval dosud nejvíce kybernetických bezpečnostních incidentů s celkovým počtem 268. Oproti roku 2023 se však jedná pouze o drobný nárůst a závažnost dopadů evidovaných incidentů klesá již třetím rokem v řadě. V minulém roce NÚKIB evidoval pouze jeden velmi významný incident a významných incidentů bylo zaznamenáno 18, což oproti roku 2023 představuje pokles o více než polovinu.
Byl publikován aktuální přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie). Servo mimo jiné nově zvládne animované obrázky APNG a WebP.
Na chytré telefony a počítačové tablety v Rusku bude od začátku příštího měsíce povinné předinstalovávat státem podporovanou komunikační aplikaci MAX, která konkuruje aplikaci WhatsApp americké společnosti Meta Platforms. Oznámila to dnes ruská vláda. Ta by podle kritiků mohla aplikaci MAX používat ke sledování uživatelů. Ruská státní média obvinění ze špehování pomocí aplikace MAX popírají. Tvrdí, že MAX má méně oprávnění k přístupu k údajům o uživatelích než konkurenční aplikace WhatsApp a Telegram.
Společnost PINE64 stojící za telefony PinePhone nebo notebooky Pinebook publikovala na svém blogu srpnový souhrn novinek. Kvůli nedostatečnému zájmu byla ukončena výroba telefonů PinePhone Pro.
Po pěti měsících vývoje byla vydána nová verze 0.15.1 programovacího jazyka Zig (GitHub, Wikipedie). Verze 0.15.0 byla přeskočena. Přispělo 162 vývojářů. Přehled novinek v poznámkách k vydání.
Před sedmi lety společnost Valve představila fork projektu Wine s názvem Proton umožňující v Linuxu přímo ze Steamu hrát počítačové hry do té doby běžící pouze ve Windows. Aktuální přehled podporovaných her na stránkách ProtonDB
Společnost DuckDuckGo rozšířila svůj AI chat Duck.ai o GPT-5 mini (𝕏). Duck.ai umožňuje anonymní přístup bez vytváření účtů k několika modelům umělé inteligence. Aktuálně k GPT-4o mini, GPT-5 mini, Llama 4 Scout, Claude Haiku 3.5 a Mistral Small 3.
Vennův diagram porovnávající nástroje curl a wget.
Tiskni
Sdílej:
#ifdef
zapnout/vypnout, ale mít jasně definované rozhraní pro moduly (např. jeden hlavičkový soubor) a mít možnost je dynamicky přidávat/odebírat (když už ne za chodu – což tady není moc potřeba – tak aspoň při startu programu bez nutnosti ho překompilovat).
Modul pak závisí jen na tom rozhraní a ne na celém programu. Program (jeho jádro) pak závisí taky jen na tom rozhraní a moduly si načte podle toho, které jsou k dispozici / nakonfigurované. Dobrým příkladem, že tohle jde dělat i v céčku, je třeba SQLite. Každá část se dá kompilovat nezávisle a poskládá se to až na počítači uživatele dle jeho potřeb.
Rozhraní modulů je definováno v souboruTzn. kdybych chtěl přidat např. podporusqlite3ext.h
(neplést ssqlite3.h
), který má cca 500 řádek kódu a obsahuje jen signatury funkcí a komentáře – není zde tedy žádný spustitelný kód a jedná se o čistě abstraktní rozhraní. Když píšeme modul, závisíme jen na tomto souboru a kompilátoru, ale nikoli na SQLite jako takovém – náš modul je po kompilaci dynamickou knihovnou a není linkovaný klibsqlite3.so
. Dá se říct, že funkce zlibsqlite3.so
jsou v době běhu do našeho modulu injektovány zvenčí.
ipfs://
do programu typu curl / wget, tak by to mělo znamenat, že vezmu jeden hlavičkový soubor čítající pár řádek (abstraktní rozhraní), implementuji jeho funkce, zkompiluji z toho sdílenou knihovnu a hodím ji do nějakého adresáře (případně přiložím nějaký popisný soubor typu Turtle, jako to má např. LV2).
Zvláštní, že jsem ještě neviděl distribuci, která by kompilovala SQLite modulárně.
Rozhraní modulů je definováno v souboru sqlite3ext.h (neplést s sqlite3.h), který má cca 500 řádek kódu a obsahuje jen signatury funkcí a komentáře – není zde tedy žádný spustitelný kód a jedná se o čistě abstraktní rozhraní. Když píšeme modul, závisíme jen na tomto souboru a kompilátoru, ale nikoli na SQLite jako takovém – náš modul je po kompilaci dynamickou knihovnou a není linkovaný k libsqlite3.so. Dá se říct, že funkce z libsqlite3.so jsou v době běhu do našeho modulu injektovány zvenčí.
Tohle je snůška nesmyslů. SQLite si za běhu přilinkuje modul a zavolá z něj sqlite3_*_init(), která zpětně volá sqlite3_create_module_v2() nacházející se v SQLite. Jak modul najde sqlite3_create_module_v2()? Inu, sqlite3ext.h includuje sqlite3.h, který jej deklaruje. To znamená, že sqlite3.h je rozhraním pro moduly. A jak modul získá adresu sqlite3_create_module_v2()? V době překladu ponechá symbol nedefinovaný a slepě se spolehne, že aplikace, která modul zavede přes dlopen(), ten symbol už budeme mít v adresním prostoru. Typická bezpečností chyba late bindingu (vašimi slovy „modul je po kompilaci dynamickou knihovnou a není linkovaný k libsqlite3.so“). Stejně blbě jako to dělá Python nebo Perl a distributoři to po nich pak musí opravovat.
#include <sqlite3.h>
, by šlo ještě napravit/vylepšit. Nicméně by se odtamtud měly používat jen struktury - žádné funkce by se neměly volat na přímo. Od toho je tam ta struktura plná ukazatelů na funkce + ta makra typu:
#define sqlite3_bind_int sqlite3_api->bind_intTzn. modul není linkovaný proti
libsqlite3.so
, závisí jen na:
linux-vdso.so.1 (0x00007ffe40d77000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88fc15d000) /lib64/ld-linux-x86-64.so.2 (0x00007f88fc3ac000)a funguje to díky tomu, že ty signatury metod v té struktuře v
sqlite3ext.h
se nemění a pasuje na ně reálná implementace, se kterou se to propojí až za běhu (SQLite naplní do té struktury ukazatele na skutečné funkce).
která zpětně volá sqlite3_create_module_v2() nacházející se v SQLite. Jak modul najde sqlite3_create_module_v2()? Inu, sqlite3ext.h includuje sqlite3.h, který jej deklaruje.Viz výše - přes makro:
#define sqlite3_create_module_v2 sqlite3_api->create_module_v2zavolá funkci, na kterou ukazuje ukazatel v této struktuře:
struct sqlite3_api_routines { ... int (*create_module_v2)(sqlite3*,const char*,const sqlite3_module*,void*, void (*xDestroy)(void *));Podobným způsobem funguje JNI a .so knihovny implementující nativní metody, které se pak volají z Javy - ani zde to moje .so nezávisí na konkrétním
libjvm.so
. Podobně, když používám JNI opačným směrem a mám program v C/C++ a uvnitř něj si ručně spustím JVM – ta moje binárka taky není při kompilaci linkovaná proti knihovnám konkrétní Javy, ale přes dlopen()
si načte libjvm.so
, kterou jí zadám (to může být třeba parametr na příkazové řádce nebo si to odvodím z $JAVA_HOME
atd.). A funkce/metody JNI se pak volají přes JNIEnv
, což je zase struktura, uvnitř které jsou ukazatele na funkce, které se tam dosadí dynamicky. Tzn. klidně si tu nativní část můžu zkompilovat s hlavičkovými soubory z Javy 17 a pak si to pouštět s libjvm.so
z Javy 8 a bude to fungovat.
To znamená, že sqlite3.h je rozhraním pro moduly.S tímhle tedy souhlasím. Ano, bylo by lepší, kdyby v
sqlite3ext.h
řádek #include <sqlite3.h>
vůbec nebyl a případné společné konstanty/signatury byly třeba ve třetím souboru.
Nicméně si myslím, že to na věci nic nemění, protože hlavní „trik“ spočívá v tom, že se funkce nevolají přímo, ale přes ukazatele v té struktuře, které se naplní za běhu tak, aby ukazovaly tam, kde ty funkce skutečně jsou (a ne tam, kde byly funkce nějaké jiné verze, když se to kompilovalo).
$ cat /usr/lib/jvm/java-17-openjdk-amd64/include/jni.h | grep '#include' #include <stdio.h> #include <stdarg.h> #include "jni_md.h" $ cat /usr/lib/jvm/java-17-openjdk-amd64/include/linux/jni_md.h | grep '#include'Tzn. můžu si zkopírovat tyhle dva hlavičkové soubory na počítač, kde Javu vůbec nemám, tam si v klidu vyvinout program/modul, a pak to dát někomu, kdo si to se svojí Javou spustí. Kdybych si např. chtěl od tebe objednat vývoj nějakých nativních metod, tak bych ti dal jen tohle + hlavičkový soubor se signaturami těch metod, které se mají implementovat (
javac -h ...
) a ty bys vůbec nemusel mít Javu a byl bys schopný to vyvinout jen na základě specifikace. Tohle je podle mého ideál, jak by to mělo vypadat – vývojář modulu není zatěžován komplexitou celku a vyvíjí jen proti nějakému izolovanému a stručnému rozhraní.
A k čemu to všechno…?Třeba abys mohl ten svůj modul načíst i z programů, které SQLite linkují staticky, což je typicky i příkaz
sqlite3
. Pokud by se tvůj modul vázal na libsqlite3.so
, zatímco program (např. sqlite3
) by v sobě měl zakompilované SQLite staticky, tak by tam ty funkce/struktury byly dvakrát a nespojilo by se to.
Díky tomu, jak je to udělané (struktura plná ukazatelů na funkce), tak můžu mít jednou zkompilovaný modul, který nezávisí na libsqlite3.so
, a ten si načíst jednou do staticky linkovaného programu (např. sqlite3
), který má SQLite zakompilované v sobě, a jindy do dynamicky linkovaného (např. ODBC ovladač pro SQLite), který se váže na libsqlite3.so
.
Původně (#23) jsi tu naznačoval nějaký problém, tak jsem se snažil vysvětlit, jak to SQLite řeší… a najednou to problém není a mohlo by to být standardní dynamické linkování? Tak jak tedy?
Naznačoval jsem, že modul volá (některé) funkce z SQLite a hledá je pomocí dynamického linkování.
Třeba abys mohl ten svůj modul načíst i z programů, které SQLite linkují staticky
Ano, tady to smysl dává. Ono obvykle to fungovat bude, i když by se modul spolehl na late binding dynamického linkování bez explicitního linkování k libsqlite3.so. Ale stačí aby se do procesu přimotala libsqlite3.so z jiného důvodu (třeba jako tranzitivní závislost), a pak se to rozsype, jak jste popsal. To by musel dynamický linker všechny zaváděné knihovny izolovat pomocí RTLD_LOCAL. Ale to by asi přineslo jiné problémy.