[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]![]() |
![]() |
![]() |
|||||||||||||||||||||||||
|
|||||||||||||||||||||||||||
![]() |
![]() |
![]() |
In <sslug@sslug> Egon Andersen <sslug@sslug> writes: >Under det mystiske subject gemmer sig et spørgsmål om hvordan jeg får >kompileret og linket mine programmer, så de ikke kræver libxxx.so.N, men >blot libxxx.so >Jeg har observeret problemet ved overgangen fra FC3 til FC4, hvor mange >libraries tidligere hed noget med libxxx.so.4, hedder de nye libxxx.so.5 >og så får jeg problemer med at de programmer jeg har kompileret under >FC3 ikke umiddelbart kan køre under FC4. >Faktisk kan jeg blot lave en symlink der hedder libxxx.so.4 til >libxxx.so.5, så kører det igen. Men det afhænger fuldstændig af hvilke funktioner i disse biblioteker du bruger. At det virker er med andre ord 99% "held". Når biblioteker skifter "major" versions-nummer er det som regel fordi ABI'et - altså interfacet mellem applikationen og biblioteks-rutinerne er blevet ændret på en inkompatibel måde. Og så skal applikationen altså re-kompileres for at du kan være sikker på at det virker. Det er sådan set hele fidusen ved at bruge versions-numre i biblioteker, og så sørge for at applikationen ved hvilken version af ABI'et den er oversat med. >Men burde jeg ikke kunne kompilere mine applikationer/programmer, så de >blot anvender libxxx.so, der er et symlink til hvad der nu måtte være på >maskinen/distroen? Nej, for din applikation er kompileret med f.eks. nogle definitioner af strukturer og variable, som kan være ændret. Hvis din applikation f.eks. kalder funktionen stat(2) (som henter oplysninger om en fil), så står der i din applikation struct stat stbuffer; stat(&stbuffer, "/tmp/minfil.txt"); Den mængde memory der afsættes til "stbuffer" variable bestemmes af compileren når du oversætter programmet. Og hvis en "struct stat" nu er 20 bytes i libc version X, men 30 bytes i libc version Y, så vil biblioteks-funktionen altså overskrive 10 tilfældige bytes i din applikations memory når du kalder stat() med det nye bibliotek via dit symlink. Hvis du vil undgå besværet med at re-compilere, så må du linke dine applikationer statisk. Det giver så bare en masse andre problemer... Henrik
![]() |
![]() |
![]() |
||||||||||||
|
||||||||||||||
![]() | ||||||||||||||
|
||||||||||||||
![]() |
![]() |
![]() |