.a, .la, och tre .so varav två är symlänkar till den tredje?

Här diskuteras programmering och utveckling
diwic
Inlägg: 96
Blev medlem: 27 jan 2008, 12:54
OS: Ubuntu
Utgåva: 20.04 Focal Fossa LTS
Kontakt:

.a, .la, och tre .so varav två är symlänkar till den tredje?

Inlägg av diwic »

Följande libSDL-filer finns nu under /usr/lib:

Kod: Markera allt

lrwxrwxrwx  1 root root       20 2008-10-24 20:54 libSDL-1.2.so.0 -> libSDL-1.2.so.0.11.1
-rw-r--r--  1 root root   426488 2008-05-08 11:04 libSDL-1.2.so.0.11.1
-rw-r--r--  1 root root   643330 2008-05-08 11:04 libSDL.a
-rw-r--r--  1 root root      794 2008-05-08 11:04 libSDL.la
lrwxrwxrwx  1 root root       20 2009-02-01 23:42 libSDL.so -> libSDL-1.2.so.0.11.1
Varav de två översta härstammar från libSDL-paketet och de tre nedersta från libSDL-dev. (Att jag valt libSDL är bara ett exempel, detta gäller generellt för libbar man importerar.) Är det någon som har tid att ge mig en liten introduktion angående vad de olika filerna spelar för roll, hur det kommer sig att det behövs fem olika filer, och när man ska använda vilken av dem? Eller nån som kan peka på rätt sida i manualen (och rätt manual)? :-)
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: .a, .la, och tre .so varav två är symlänkar till den tredje?

Inlägg av Konservburk »

.la (libtool archive) används av libtool: http://en.wikipedia.org/wiki/Libtool
.a (archive) används när du kompilerat något själv och väljer att länka statiskt
.so (shared object) används när du kör ett program som är länkat dynamiskt

Symlänkarna är till för att allting inte ska behöva länka direkt till den exakta versionen.
diwic
Inlägg: 96
Blev medlem: 27 jan 2008, 12:54
OS: Ubuntu
Utgåva: 20.04 Focal Fossa LTS
Kontakt:

Re: .a, .la, och tre .so varav två är symlänkar till den tredje?

Inlägg av diwic »

Hmm...okej, visade sig att .la var en textfil med lite konfiguration i. Och .a följer med när man installerar ett dev-paket men är i många (de flesta?) fall helt onödig, dvs när man länkar dynamiskt?

Vad som fortfarande känns skumt dock är varför dev-versionen installerar en extra symlänk (libSDL.so) när det redan finns en (libSDL-1.2.so.0)? Och det verkar inte vara det enda paketet där det ser ut så. Om jag nu länkar dynamiskt till libSDL.so, kan det programmet fungera utan att dev-versionen är installerad? Poängen är väl att dev-versionen bara ska behövas när man kompilerar/länkar?
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: .a, .la, och tre .so varav två är symlänkar till den tredje?

Inlägg av Konservburk »

.a används när du länkar statiskt, medan symlänken som slutar på .so används när du länkar dynamiskt. Tänker du inte länka själv så behövs ingen av dem. Det är därför de ligger i ett separat dev-paket.
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: .a, .la, och tre .so varav två är symlänkar till den tredje?

Inlägg av Lars »

Vet någon varför man inte kan länka statiskt direkt mot .so-filerna? Koden finns ju där också, så den borde kunna väl kunna klippas ur och läggas in statiskt i den exekverbara filen, i alla fall i teorin.

Archive-filerna (.a) kan för övrigt läsas och skrivas med kommandot ar (testa t.ex. "ar t /usr/lib/libc.a")
diwic
Inlägg: 96
Blev medlem: 27 jan 2008, 12:54
OS: Ubuntu
Utgåva: 20.04 Focal Fossa LTS
Kontakt:

Re: .a, .la, och tre .so varav två är symlänkar till den tredje?

Inlägg av diwic »

Konservburk skrev:.a används när du länkar statiskt, medan symlänken som slutar på .so används när du länkar dynamiskt. Tänker du inte länka själv så behövs ingen av dem. Det är därför de ligger i ett separat dev-paket.
Men antag nu att jag länkar dynamiskt mot "libSDL.so". Då antar jag att texten "libSDL.so" hamnar nånstans i min kompilerade fil. Sen skickar jag filen till en kompis, som inte har dev-paketet installerat. När han försöker köra min fil så borde han få ett fel eftersom han inte har installerat symlänken "libSDL.so"...? Men så blir det ju inte (väl?), så var resonerar jag fel?

Vad jag inte förstår är hur symlänken "libSDL.so" kan behövas när man länkar programmet men inte när man kör det? Det känns som om orsaken till de två symlänkarna (och att bara den ena finns i dev-paketet) kanske inte är direkt teknisk utan mer praktisk på något vis, men vilket?
diwic
Inlägg: 96
Blev medlem: 27 jan 2008, 12:54
OS: Ubuntu
Utgåva: 20.04 Focal Fossa LTS
Kontakt:

Re: .a, .la, och tre .so varav två är symlänkar till den tredje?

Inlägg av diwic »

Lars skrev:Vet någon varför man inte kan länka statiskt direkt mot .so-filerna? Koden finns ju där också, så den borde kunna väl kunna klippas ur och läggas in statiskt i den exekverbara filen, i alla fall i teorin.
Det kanske blir klurigt att luska ut vilka globala variabler som också ska vara med, och vilka som inte behövs?
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

Re: .a, .la, och tre .so varav två är symlänkar till den tredje?

Inlägg av Konservburk »

diwic skrev:Men antag nu att jag länkar dynamiskt mot "libSDL.so". Då antar jag att texten "libSDL.so" hamnar nånstans i min kompilerade fil. Sen skickar jag filen till en kompis, som inte har dev-paketet installerat. När han försöker köra min fil så borde han få ett fel eftersom han inte har installerat symlänken "libSDL.so"...? Men så blir det ju inte (väl?), så var resonerar jag fel?
Nej, så blir det ju inte. Det är strängen "libSDL-1.2.so.0" som kommer finnas någonstans i binärfilen.
diwic skrev:Vad jag inte förstår är hur symlänken "libSDL.so" kan behövas när man länkar programmet men inte när man kör det? Det känns som om orsaken till de två symlänkarna (och att bara den ena finns i dev-paketet) kanske inte är direkt teknisk utan mer praktisk på något vis, men vilket?
Jag kanske ska vara mer tydlig...

libSDL-1.2.so.0.11.1 är den egentliga biblioteksfilen.

libSDL-1.2.so.0 är en symlänk som pekar på den egentliga filen. Det är den här symlänken den dynamiska länkningen sker mot när själva programmet sedan körs (strängen "libSDL-1.2.so.0" finns i binärfilen).

libSDL.so är också en symlänk som pekar på den egentliga filen. Den här symlänken behövs bara under själva kompileringen. Den tillåter dig att använda -lSDL istället för att skriva in hela sökvägen (/usr/lib/libSDL-1.2.so.0.11.2).

Jag har för mig att jag har sett en hyfsat bra genomgång av detta någonstans. Jag återkommer om jag hittar den.
Skriv svar

Återgå till "Programmering och webbdesign"