Vývojáři KDE na Mastodonu oznámili vydání balíku aplikací KDE Gear 26.08. Přehled novinek i s náhledy a videi v oficiálním oznámení.
Společnost PINE64 kvůli nedostatku a vysokým cenám DRAM a eMMC dočasně pozastavuje výrobu linuxových zařízení. Výroba zařízení jako PineTime, PineVoice a Pinecil pokračuje.
Společnost Stripe se dohodla na akvizici společnosti OpenRouter. Za 7,5 miliardy dolarů.
Byla vydána nová verze 1.27 programovacího jazyka Go (Wikipedie). Přehled novinek v poznámkách k vydání.
V pátek 28. srpna se v Praze uskuteční již osmý Mobile Linux Hackday. Jako obvykle se potkáme v pražské pobočce SUSE v Karlíně na Křižíkově, takže kromě mobilního Linuxu je to tentokrát i příležitost přijít se podívat na nově zrekonstruované kanceláře. Začínáme v 10:00, ale dorazit můžete samozřejmě kdykoliv v průběhu dne. Setkáním vás provede David Heidelberg, vývojář GPU ovladačů v Mesa 3D a jeden z hlavních lidí české komunity kolem … více »
Představen byl Raspberry Pi Compute Module 5 Programming Jig. Jedná se o zařízení umožňující připravit Compute Module 5 do plně funkčního stavu bez nutnosti použití dalších vstupně / výstupních desek. Podporuje automatizaci pomocí nástroje rpi-sb-provisioner. Podrobnosti v dokumentaci.
Hackeři ve Francii ukradli data více než půl milionu daňových poplatníků. Je to jeden z největších hackerských útoků v dějinách země. O útoku z konce června informovala až teď daňová správa. Teprve od pondělí dotčeným občanům zasílá e-maily s instrukcemi, jak postupovat dál. Hackeři se sice nedostanou k penězům dotyčných, hrozí ale věrohodné podvody. Hackeři získali třeba celá jména, údaje o rodinných příslušnících nebo také údaje o
… více »Společnost Framework představila nový Framework Laptop 12 s Intel Core Series 3, Thunderbolt 4, Wi-Fi 7, volitelnou čtečkou otisků prstů a podsvícenou klávesnicí s open-source firmwarem ZMK. Objednat lze s předinstalovanou Fedorou 44 KDE Plasma.
Byl vydán Mozilla Firefox 154.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 154 bude brzy k dispozici také na Flathubu a Snapcraftu.
Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 168 (pdf).
/**
* @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: