ldconfig não pode vincular a arquivos específicos

2

Instalei ATLAS (com Netlib LAPACK ) em uma imagem do Docker e, agora, toda vez que executo ldconfig , recebo os seguintes erros:

ldconfig: Can't link /usr/local/lib//usr/local/lib/libtatlas.so to libtatlas.so
ldconfig: Can't link /usr/local/lib//usr/local/lib/libsatlas.so to libsatlas.so

É claro que /usr/local/lib//usr/local/lib/libtatlas.so não existe, mas estou confuso por que ele tentaria procurar esse arquivo, pois libtatlas.so não é um link simbólico:

root@cd00953552ab:/usr/local/lib# ls -la | grep atlas
-rw-r--r-- 1 root staff 15242054 Apr 27 08:18 libatlas.a
-rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libatlas.so
-rwxr-xr-x 1 root staff 17492184 Apr 27 08:18 libsatlas.so
-rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libtatlas.so

Por que isso estaria acontecendo e há uma maneira de corrigir isso / desativar essa mensagem de erro?

Edit: Aqui está a saída do Readelf:

root@cd00953552ab:/usr/local/lib# eu-readelf -a /usr/local/lib/libatlas.so | grep SONAME
  SONAME            Library soname: [/usr/local/lib/libtatlas.so]
    
por josh 27.04.2017 / 11:05

1 resposta

3

Por algum motivo, provavelmente relacionado ao modo como as bibliotecas foram criadas (e, mais especificamente, vinculadas), elas armazenaram o diretório de instalação em seu nome sonoro: assim, o nome do filho de libtatlas.so é /usr/local/lib/libtatlas.so . ldconfig tenta vincular as bibliotecas ao seu soname, se ele não existe, no mesmo diretório: ele encontra /usr/local/lib/libtatlas.so , verifica seu soname, determina que um link precisa ser feito de /usr/local/lib//usr/local/lib/libtatlas.so (o diretório e o soname concatenado) para /usr/local/lib/libtatlas.so e falha porque /usr/local/lib/usr/local/lib não existe.

A maneira apropriada de corrigir isso é garantir que os nomes das bibliotecas sejam definidos corretamente. Normalmente, eu esperaria libtatlas.so.3 etc. sem nome de diretório (a versão dependeria do nível de ABI da biblioteca que está sendo construída). Você provavelmente precisará reconstruir as bibliotecas ou encontrar um pacote corretamente construído ...

Como alternativa, você pode editar o soname de uma biblioteca usando PatchELF :

patchelf --set-soname libtatlas.so /usr/local/lib/libtatlas.so

O ideal é que você vincule novamente os programas criados por você nesta biblioteca, pois eles também terão o soname incorporado (você também pode corrigir isso usando o PatchELF).

Em um sistema em evolução, você realmente deseja especificar uma versão no soname, mas em um contêiner provavelmente isso não importa - você deve estar reconstruindo o contêiner para upgrades de qualquer maneira.

    
por 27.04.2017 / 11:26

Tags