Linux volání funkce z přilinkované knihovny .a

Milfaus

Linux volání funkce z přilinkované knihovny .a
« kdy: 01. 09. 2017, 20:59:13 »
Ahoj,

rád bych se zeptal, jak je to na linuxu s voláním knihovní funkce přilinkované k programu?
Nějak mi to nende vygooglovat, nevypadávají relevantní výsledky.

Mám program, který přeložím:
gcc ..... knihovna.a

Dochází při volání knihovní funkce ke zpoždění?
Resp. penalizace cca ~500 taktů jako na Widlows?


Aoidhghean

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #1 kdy: 01. 09. 2017, 21:24:35 »
Ahoj,

rád bych se zeptal, jak je to na linuxu s voláním knihovní funkce přilinkované k programu?
Nějak mi to nende vygooglovat, nevypadávají relevantní výsledky.

Mám program, který přeložím:
gcc ..... knihovna.a

Dochází při volání knihovní funkce ke zpoždění?
Resp. penalizace cca ~500 taktů jako na Widlows?
Statická knihovna se přilinkuje celá přímo do binárky, tam ke zpoždění nedochází.

Milfaus

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #2 kdy: 01. 09. 2017, 21:35:14 »
Statická knihovna se přilinkuje celá přímo do binárky, tam ke zpoždění nedochází.

Díky za info ohledně toho zpoždění!

MD

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #3 kdy: 01. 09. 2017, 22:19:21 »
Mohl byste dát zdroj ohledně informací o zpoždění na Windows? Pokud se nejedná o delay loaded imports, zpoždění by nemělo být žádné.

Milfaus

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #4 kdy: 01. 09. 2017, 23:21:56 »
zpoždění by nemělo být žádné.

C# při volání externích knihoven načtených přes dllimport a P/Invoke je údajně penalizováno (poměrně logicky).
Dokonce jsou nějaké postupy, jak to trochu zkrotit.
Hodnoty sem viděl v dokumentaci přímo od MS, ale obratem ruky je nejspíš nedohledám.



MD

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #5 kdy: 01. 09. 2017, 23:53:16 »
Aha, máte na mysli přechod z managed do unmanaged kódu (tam penalizace je). Z úvodního příspěvku jsen nabyl dojmu, že mluvíte o volání funkcí v rámci C/C++ (nativního kódu).

Milfaus

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #6 kdy: 02. 09. 2017, 00:03:26 »
Jojo, mě právě zajímalo, jak je to u linuxu.

.

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #7 kdy: 02. 09. 2017, 04:25:21 »
Jojo, mě právě zajímalo, jak je to u linuxu.
"U linuxu" je to v takovém případě stejně jako všude jinde.

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #8 kdy: 02. 09. 2017, 08:34:52 »
Tak funkce ze statické knihovny (.a) jsou přilinkované ve výsledném bináru, ne?

A samotné volání funkce v c je (zhruba):
1. Naskládání parametrů (od posledního k prvnímu) na zásobník (push <parametr1>, push ...).
2. Volání funkce (call <adresa funkce>)

(pokud není kompilátor požádán o "inlajnizaci" (od c99 tuším))

Proč by to v linuxu mělo být jinak?

Neviditelný

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #9 kdy: 02. 09. 2017, 09:15:47 »
Mícháte zde dohromady několik nesouvisejících věcí. Volání knihovní funkce z "dřevních" jazyků jako C(++), Fortran atp. není zatíženo žádnou režií. Na příslušná místa se nasází parametry volané funkce a procesor pak odskočí na adresu, kde kód volané funkce začíná. Rozdíl mezi staticky a dynamicky linkovanou knihovnou je jen v tom, že u dynamicky linkovaných knihoven je nejdřív nutné zjistit, kde v paměti se kód volané funkce nachází. To se provede buď hned při spuštění programu nebo v okamžiku, kdy se ta funkce zavolá. Provede se to ale vždy jen jednou. Staticky linkované knihovny se stanou součástí zkompilované binárky a vše se tedy může zařídit už při překladu.

Režie .NET spojená s voláním nativního kódu je zcela nesouvisející problém. Pokud něco podobného umožňuje Mono nebo .NET Core, čekal bych nějaký overhead i na Linuxu.

JSH

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #10 kdy: 02. 09. 2017, 10:38:13 »
Volání knihovní funkce z "dřevních" jazyků jako C(++), Fortran atp. není zatíženo žádnou režií. Na příslušná místa se nasází parametry volané funkce a procesor pak odskočí na adresu, kde kód volané funkce začíná. Rozdíl mezi staticky a dynamicky linkovanou knihovnou je jen v tom, že u dynamicky linkovaných knihoven je nejdřív nutné zjistit, kde v paměti se kód volané funkce nachází. To se provede buď hned při spuštění programu nebo v okamžiku, kdy se ta funkce zavolá. Provede se to ale vždy jen jednou. Staticky linkované knihovny se stanou součástí zkompilované binárky a vše se tedy může zařídit už při překladu.
Rozdíl je i v tom, že volání do dynamické knihovny je nepřímé volání přes ukazatel na funkci. Volání do statické knihovny má tu adresu přímo v kódu. Znamená to jedno čtení z paměti navíc. Starší procesory tam měly i problém s predikcí větvení, takže nepřímé volání znamenalo vyprázdnění pipeline a zdržení v desítkách taktů. Novější už to zvládají predikovat. Pořád je to ale jeden potenciální cache miss navíc. Je to podobné rozdílu mezi virtuální a nevirtuální metodou.

Ale samozřejmě pro většinu normálních funkcí, které něco rozumného dělají, je ten rozdíl zanedbatelný.

Milfaus

Re:Linux volání funkce z přilinkované knihovny .a
« Odpověď #11 kdy: 03. 09. 2017, 01:11:08 »

Děkuji za vyčerpávající odpověď!