Gentoo er ikkje alltid så enkelt

På den eine datamaskina mi har eg hatt ein feil i mellom eit og to år no. I dag fann eg ut kvifor.

Feilmeldinga eg fekk var:

x86_64-pc-linux-gnu-gcc: /usr/lib/../lib64/libstdc++.so: No such file or directory

Denne dukka opp rett som det var.

Ein stund løyste eg problemet med symlink /usr/lib/libstdc++.so -> /usr/lib64/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so

Dette var derimot ikkje ei løysing eg var fornøgd med sidan eg ikkje kunne ldconfig godt nok til å vite om den symlinken var relevant for å hindra at problemet vart fiksa permanent. Ulempa med symlink er at den ikkje vert oppdatert ved gcc-oppgradering og det er ikkje bra dersom ein miksar libstdc++-versjonar. Dette fordi dei ikkje er binært kompatible.

Problemet gjekk ikkje bort av seg sjølv. Eg har hatt det lenge nok til å oppgradere alle systempakkene fleire gongar etter at problemet oppstod, og eg har til og med reinstallert nesten alle bibliotek og program på maskina etter at eg oppgraderte til gcc-4.4.3 for vel ei veke sidan. Problemet var der framleis, men gjeld berre ein 7-10 program.

Når eg no ville installere mono, og gdk-sharp feilte med den feilen vart eg motivert til å undersøkja litt meir.

Det fanst ein la-fil i /usr/lib som ikkje skulle vera der: /usr/lib/libstdc++.la. Denne fila fortalde ldconfig at den berre skulle leite etter libstdc++.so i /usr/portage, men der skal den ikkje eksistere. Dette gjorde at det fungerte med symlink, men ikkje utan symlink.

No er fila borte og gcc fungerer som det skal. Og viktigast av alt, eg har lært meg kva .la-filer er, og at eg kanskje har fleire som ikkje bør eksistere.

Valg for kommentarvisning

Velg din foretrukket måte å vise kommentarer på og klikk på "Lagre innstillinger" for å aktivere endringene.

ak

Prøv å slette / flytte de lenkene du lagde og kjøre revdep-rebuild, programmet ligger i gentoolkit pakken hvis jeg ikke husker feil. Jeg kjører det ganske jevnlig.

QtanJ

Det gjorde eg mange gonger, men revdep-rebuild fikser ikkje dette problemet. Det var ein .la-fil som ikkje var registrert i pakkesystemet. Denne vert ikkje fjerna sjølv om eg byggjer heile systemet på nytt. Det einaste ein kan gjera er å fjerna fila manuelt.

Det eg skal gjera no er å finna ut om det finst fleire .la-filer som ikkje er registrert.

Reconcilio(paludis sin revdep-rebuild) er i bruk rett som det er, men eg har også prøvd revdep-rebuild for å sjå om dei var ulike.

Standardsvaret på denne typen problem er
fix_libtool_files.sh
emerge -1 libtool
.
Derimot var verken systembiblioteka eller dei køybare programma feil. Difor ville ikkje revdep-rebuild/reconcilio klart å identifisera at det var eit problem. Problemet var berre mogleg å oppdaga ved køyring av libtool.

Program som ikkje bruker libstdc++ direkte fungerte fint i og med at desse dynamiske biblioteka ikkje knytte seg direkte mot libstdc++. Ikkje ein gong C++-program treng knyte seg til libstdc++ direkte.

Flameeyes har skrive mange blogginnlegg om emnet. Spesielt den siste(12. mai, heilt øvst) trur eg var nødvendig for at eg skulle klare å identifisera problemet.

ak

Ok, da lærte jeg også noe nytt (må lese litt mer). Takk for det :)

QtanJ

Eg redigerte innlegget mitt slik at eg lenka til bloggen til flameeyes. Den har ein del om la-filar.

Du kan eventuelt prøva å leggja denne filen i /usr/lib/libstdc++.la.

Då kan eg garantera deg at du får ein del problem.

# libstdc++.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.4a-GCC3.0 (1.641.2.256 2001/05/28 20:09:07 with GCC-local changes)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.

# The name that we can dlopen(3).
dlname='libstdc++.so.6'

# Names of this library.
library_names='libstdc++.so.6.0.3 libstdc++.so.6 libstdc++.so'

# The name of the static archive.
old_library='libstdc++.a'

# Libraries that this one depends upon.
dependency_libs=' -L/usr/x86_64-pc-linux-gnu/bin -L/usr/x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6 -L/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -lm -lgcc_s -lc'

# Version information for libstdc++.
current=6
age=0
revision=3

# Is this an already installed library?
installed=yes

# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''

# Directory that this library needs to be installed in:
libdir='/usr/lib/'

  • Skriv ut artikkel
  • Abonner med RSS