Na Slovensku vznikla úplne nová rally hra, ktorá je zadarmo a funguje vo Windowse, Linuxe či na Macu. Greenie Rally má viac ako 50 tratí a vozidiel, šampionáty či turnaje. Má retro feeling a imituje automobilové hry z prelomu tisícročí. Vyskúšate prejsť všetky mapy na Škode 130RS?
Do základního systému NetBSD -current byl přidán nový editor atto jako alternativa k editorům vi a xedit.
Společnost System76 představila kompaktní 11litrový Thelio Prime Desktop. S procesorem AMD Ryzen 9000. S Pop!_OS 24.04 LTS s desktopovým prostředím COSMIC nebo Ubuntu 24.04 LTS.
Čínská státní televize pozastavila vysílání španělské La Ligy a čínské internetové platformy omezily obsah s Kylianem Mbappém poté, co slavný fotbalista ve francouzském pořadu The Bridge mluvil o svém oblíbeném memu, v němž je jeho tvář vložena do portrétu zobrazujícího diktátora Mao Ce-tunga. 'Můj oblíbený mem je ten, na kterém dali můj obličej na čínského diktátora. To mě opravdu rozesmívá. S přáteli ho používám pořád' řekl,
… více »Při příležitosti oslav Dne vzniku samostatného československého státu (28. října) byly uděleny medaile Za zásluhy tvůrci aplikace Záchranka Filipu Maleňákovi, vědci v oblasti umělé inteligence Tomáši Mikolovovi a Olze Štěpánkové, vědkyni zabývající se kybernetikou, robotikou a strojovým učením, průkopnici v oblastech výuky a využití umělé inteligence v medicínském inženýrství.
Apple představil nový iPad mini, iMac s čipem M6, 14palcový MacBook Pro s čipem M6 a MacBook Pro s PROLED XDR displejem – první Mac s dotykovým ovládáním.
Nedávno představený projekt mapSTL.com řeší budoucnost. 𝕏: "Netušil jsem, kolik patentů na generování map existuje. Existují patenty na generování fantasy map 🫣. Cokoliv je na 3D tiskárnu a tvoří to produkt, bude to mít patenty. Tak bacha na to!" … více »
Multiplatformní emulátor terminálu Ghostty byl vydán ve verzi 1.4 (𝕏). Přehled novinek a vylepšení v poznámkách k vydání.
Byla objevena zranitelnost Tailworm v Tailscale a Headscale umožňující lokální eskalaci práv přihlášeného uživatele. Následně byla v Tailscale v opravené verzi 1.104.4+ změněna architektura aplikace. Viz příspěvek na blogu Tailscale.
/**
* @file kontrolni.c
*/
void hello(void) {
printf("Hello, library world.\n");
}
Tu si prelozim a nahraju jako dynamicky sdilenou knihovnu kontrolni.so:
gcc -Wall -fPIC -c kontrolni.c gcc -shared -Wl,-soname,kontrolni.so.0 -o kontrolni.so.0.0.1 kontrolni.oNo a dle nekolika manualu jsem se znazil tu mou fci hello z knihovny kontrolni.so zavolat:
typedef void* (*arbitrary)(); arbitrary my_function; void* handle = dlopen(0,RTLD_NOW|RTLD_GLOBAL); *(void**)(&my_function) = dlsym(handle,"hello"); my_function(); dlclose(handle);Nasel jsem si i manual, kde se vola fce takto:
void *handle;
int *iptr, (*fptr)(int);
/* open the needed object */
handle = dlopen("/usr/home/me/libfoo.so", RTLD_LOCAL | RTLD_LAZY);
/* find the address of function and data objects */
*(void **)(&fptr) = dlsym(handle, "my_function");
iptr = (int *)dlsym(handle, "my_object");
/* invoke function, passing value of integer as a parameter */
(*fptr)(*iptr);
Jenomze jsem se jeste nedocet, co by mely byt ty data objects. POstradam nejaky konkretni priklad.
Mohl by mi nekdo ukazat svetlo v tunelu a navest me? :) Fakt nevim, co delam spatne.
Řešení dotazu:
#include <kontrolni.h>
int
main(void)
{
hello();
return 0;
}
kde v kontrolni.h je příslušná deklarace hello a pak
gcc -o program program.o -lkontrolni
Pokud chceš napoak otevřít knihovnu až za běhu pomocí dlopen(), tak první argument je jméno souboru s knihovnou, tedy "/cesta/někam/kontrolni.so". NULL znamená otevřít tímto způsobem sám program, aby mohl hledat symboly sám v sobě (což má smysl pouze při linkování s --export-dynamic); 0 je totéž co NULL + zblbost C++...
Konvence pojmenování je
(a) Dynamická knihovna s verzovaným interface: libfoo.so.1.2.3, kde čísla definují verze interface, viz sekci Versioning v dokumentaci libtoolu.
(b) Dynamická knihovna, kde se na verzování interface nehraje, protože není kompatibilní s předchozími ani následujícími: libfoo-1.2.3.so, kde 1.2.3 je prostě verze.
(c) Dynamický modul pro dlopen()ování: foo.so, bez lib a bez verzí (případné verzování se tady řeší až něčím, co se po otevření modulu najde uvnitř).
Důvod prefixu lib v (a) a (b) je, že ho linker zase odstraňuje, tj. -lfoo hledá libfoo; taky ti v tom případě něco musí udělat ten smylink z libfoo.so.0 na libfoo.so.0.0.0 (normálně ldconfig) a ta knihovna musí být v LD_LIBRARY_PATH nebo musíš použít -rpath (což ostatně platí i pro dlopenování, i když tam se spíš používá plná cesta, případně můžeš napsat "./kontrolni.so" pro aktuální adresář). Název kontrolni.so.0.0.0 do toho nezapadá a opět těžko říci, o kterou z tech tří věci se snažíš.
Konečně, ta deklarace arbitrary je blbě, pokud funkce vrací void, protože ji máš deklarovánu jako funkci vracející ukazatel (navíc nemá deklarovány argumenty), a program neřeší kontrolu chyb, ani nepíšeš, co vlastně nefunguje, takže těžko říci. Mi to po opravení chyb a upravení na případ (c) normálně funguje.
void (*my_function)(void); //PRoc takovato deklarace? Potoze fce hello je deklarovana jako void hello(void)
void* handle = dlopen("/home/.../.../Vyvoj_C/libkontrolni.so", RTLD_NOW); //misto tri tecek je cesta k souboru
if(handle==NULL) {
fputs (dlerror(), stderr);
exit(1);
}
my_function = dlsym(handle,"hello");
if(my_function==NULL) {
fputs(error, stderr);
exit(1);
}
my_function();
dlclose(handle);
Diky osetreni chb mi ted pocitac nadava, ze ta knihovna vubec neexistuje:
Vyvoj_C/kontrolni.so: cannot open shared object file: No such file or directoryPokud ovsem prepisu volani dlopen na:
dlopen(".../Vyvoj_C/libkontrolni.so.0.0.1", RTLD_NOW)
Tak se mi ta ma fce zavola a Hello, world, se vytiskne... Funguje tedy pripad (a), ale ne pripad (c). Mohl bys mi jeste osvetlit proc? Zajimalo by me, co mi uniklo, co jsem nepochopil. Diky.
NAME=pokusny CC=gcc CFLAGS=-ldl -std=c99 -pedantic -Wall -Wextra -D_GNU_SOURCE #kompilace programu $(NAME): main.c $(CC) $(CFLAGS) main.c -o $(NAME) pokusne.o: pokusne.c $(CC) $(CFLAGS) convertions.c -c #kompilace sdilene knihovny convert.o : convert.c $(CC) -Wall -fPIC -c kontrolni.c convert.o : convert.c $(CC) -shared -Wl,-soname,kontrolni.so.0 -o libkontrolni.so.0.0.1 kontrolni.oPriznam se, ze to s Makefile moc neumim. Nic jsem poradne k psani makefile pro shared libaries nevygooglil. Vyse zmineny Makefile mi udela binarku s programem, ale knihovnu nevytvori. V prikazove radce mi to ale pekne tu knihovnu vytvori:
gcc -Wall -fPIC -c pokusny.c gcc -shared -Wl,-soname,kontrolni.so.0 -o libconvert.so.0.0.1 convert.o
make -C subprojekt) a na začátku all, které závisí na všem. Pokud používáš git, lehce se pak dají použít jeho submoduly. Stejně pak můžeš přibalit testy, dokumentaci, další nástroje,...
my_function = dlsym(handle, "hello");a mělo by to být v pohodě. Rozhodně však přidej kontrolu, zda se
dlopen a dlsym povedly, neboť se aspoň dozvíš, co je špatně.
Jinak to vypadá celkem v pořádku. Tedy za předpokladu, že v době kompilace nevíš, zda tu knihovnu opravdu potřebuješ (volitelná součást/výběr dle architektury) nebo v případě, že se jedná o nějaký plugin.
Tiskni
Sdílej: