Bylo oznámeno, že webový prohlížeč Opera GX zaměřený na hráče počítačových her je už také na Flathubu and Snapcraftu.
Akcionáři americké mediální společnosti Warner Bros. Discovery dnes schválili převzetí firmy konkurentem Paramount Skydance za zhruba 110 miliard dolarů (téměř 2,3 bilionu Kč). Firmy se na spojení dohodly v únoru. O část společnosti Warner Bros. Discovery dříve usilovala rovněž streamovací platforma Netflix, se svou nabídkou však neuspěla. Transakci ještě budou schvalovat regulační orgány, a to nejen ve Spojených státech, ale také
… více »Canonical vydal (email, blog, YouTube) Ubuntu 26.04 LTS Resolute Raccoon. Přehled novinek v poznámkách k vydání. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 11. vydání s dlouhodobou podporou (LTS).
V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Gitea (Wikipedie) byla vydána v nové verzi 1.26.0. Přehled novinek v příspěvku na blogu.
Ve středu 29. dubna 2026 se v pražské kanceláři SUSE v Karlíně uskuteční 7. Mobile Linux Hackday, komunitní setkání zaměřené na Linux na mobilních zařízeních, kernelový vývoj i uživatelský prostor. Akce proběhne od 10:00 do večerních hodin. Hackday je určen všem zájemcům o praktickou práci s Linuxem na telefonech. Zaměří se na vývoj aplikací v userspace, například bankovní aplikace, zpracování obrazu z kamery nebo práci s NFC, i na úpravy
… více »LilyPond (Wikipedie) , tj. multiplatformní svobodný software určený pro sazbu notových zápisů, byl vydán ve verzi 2.26.0. Přehled novinek v aktualizované dokumentaci.
Byla vydána nová verze 11.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 237 vývojářů. Provedeno bylo více než 2 500 commitů. Přehled úprav a nových vlastností v seznamu změn.
Společnost SpaceX amerického miliardáře Elona Muska oznámila, že si zajistila opci buď na akvizici startupu Cursor za 60 miliard dolarů (přes 1,2 bilionu Kč) do konce letošního roku, nebo na zaplacení deseti miliard dolarů za nové partnerství s touto firmou zabývající se generováním kódů. SpaceX se dále prosazuje na lukrativním trhu s vývojářskými nástroji pro umělou inteligenci (AI). Cursor, startup zabývající se prodejem modelů AI pro
… více »Díky AI modelu Claude Mythos Preview od společnost Anthropic bylo ve Firefoxu nalezeno a opraveno 271 zranitelností.
Byla vydána nová verze 2.54.0 distribuovaného systému správy verzí Git. Přispělo 137 vývojářů, z toho 66 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.
V kazdem jakzyku budete mrvit neco jineho, kdyz nebudete poradne investovat do kvality.
#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.sojsou 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.
Tiskni
Sdílej: