Portál AbcLinuxu, 7. května 2025 03:25

Dotaz: libc.so a stat()

18.5.2021 09:05 rastos | skóre: 63 | blog: rastos
libc.so a stat()
Přečteno: 548×
Odpovědět | Admin
Napísal som si knižnicu v jazyku C. Skompiloval na stroji A a preniesol na iný stroj B a tam mi nezafunguje pretože na A je libc-2.33.so, ktorá funkciu stat() definuje ako "weak symbol" a na stroji B je libc-2.30.so, ktorá stat() nedefinuje vôbec. Kompilovanie tej istej knižnice na B vyrobí binárku, ktorá má stat() v sebe - teda tá funkcia bola prilinkovaná staticky. Ak tomu dobre rozumiem, tak bola zobraná zo statickej verzie libc.

Dá sa na stroji A nejako (linkeru?) povedať nech vyrobí binárku, ktorá bude fungovať na rôznych strojoch bez ohľadu na "drobné rozdiely" vo verzii libc?

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

18.5.2021 10:16 X
Rozbalit Rozbalit vše Re: libc.so a stat()
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nestacilo by to staticky nalinkovat pomoci:
-static
?
18.5.2021 11:07 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: libc.so a stat()
Myslíš takto?
$ cat stat.c 
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

void fnc(const char *filename)
{
        struct stat st;
        stat(filename,&st);
}
$ gcc -fPIC -shared -o libStat.so stat.c -static -lc
$ nm -D libStat.so |grep -w stat
                 U stat
Asi nestačilo.
18.5.2021 22:54 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: libc.so a stat()
Volby -shared a -static se podle mě vylučují a specifikují výsledný produkt, nikoli způsob linkování závislostí.

Potřebujete linkovat s libc.a (nikoli libc.so), tedy něco jako:

gcc -o libtest.so test.c crt1.o libc.a -lm -lc -lgcc

Netestováno.
-- OldFrog
19.5.2021 10:42 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: libc.so a stat()
man ld

-static
Do not link against shared libraries. ... You may use this option multiple times on the command line: it affects library searching for -l options which follow it.

-shared
Create a shared library.

19.5.2021 21:06 OldFrog {Ondra Nemecek} | skóre: 36 | blog: Žabákův notes | Praha
Rozbalit Rozbalit vše Re: libc.so a stat()
Tak to se omlouvám za mystifikaci.
-- OldFrog
19.5.2021 19:31 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: libc.so a stat()
-U znaci, ze je dynamicky.
debian.plus@protonmail.com
19.5.2021 20:45 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: libc.so a stat()
No veď áno. To je práve ten problém.

Na stroji A dynamický linker loadne moju knižnicu, zistí, že symbol "stat" v binárke mojej knižnice je (U)ndefined, hľadá ho a nájde ho v libc.so.

Keď takú binárku prenesiem na stroj B, kde libc.so neposkytuje symbol "stat", tak tam tá knižnica nefunguje lebo dynamický linker loadne moju knižnicu zistí, že symbol "stat" je v binárke mojej knižnice (U)ndefined, hľadá ho a nikde ho nenájde.

Keď na stroji B skompilujem tie isté zdrojáky, tak symbol "stat" je priamo v mojej knižnici ako (t)text - teda ḱód tej funkcie je priamo v binárke mojej knižnice.
$ nm  libStat.so |grep -w stat
00000000000082e0 t stat
Domnievam sa, že by malo byť možné na stroji A prinútiť linker vyrobiť tiež binárku, ktorá obsahuje (t)ext funkcie stat(). Taká binárka by potom fungovala na oboch systémoch. Otázka je: ako to tomu linkeru na stroji A povedať?
19.5.2021 21:39 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: libc.so a stat()
Mám o preklade napísaný nový svoj blog.
debian.plus@protonmail.com
18.5.2021 18:17 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: libc.so a stat()
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pozor pri statickom linkovani na licenciu/licencie. Glibc byva dost velka, najdi si aj ine c-library implementacie.
debian.plus@protonmail.com
19.5.2021 19:34 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: libc.so a stat()
Odpovědět | | Sbalit | Link | Blokovat | Admin
https://wiki.debian.org/musl

A nezabudni na licenciu c musl knižnice pridať ku svojmu programu, ked staticky linkuješ tu c knižnicu.
debian.plus@protonmail.com

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.