Biblioteca compartilhada não está carregando. Carregando apenas sob root

3

Eu tenho um executável que requer uma biblioteca compartilhada que reside na pasta /opt/... . Incluí o caminho em LD_LIBRARY_PATH em /etc/environment e atualizei-o usando source /etc/environment . Quando executo esse executável sem permissões de root, recebo um erro dizendo libxxx.so: cannot open shared object file: No such file or directory . Mas quando eu corro com sudo , ele roda. Embora o problema seja, a licença não está sob o usuário root, portanto, gera um erro relacionado à licença. Alterei a permissão para /opt/... para que o usuário normal possa criar e excluir arquivos. Porém, isso não ajuda. O que há de errado e como faço para corrigir isso?

    
por user592748 07.05.2013 / 17:48

1 resposta

3

/etc/environment é interpretado durante o login. Portanto, a maneira correta de ver as alterações feitas em /etc/environment é fazer logout e login novamente.

sudo funciona porque emula parcialmente o login como root ( sudo -i emula o login com mais precisão).

source /etc/environment não funciona, porque source é um comando shell que diz ao shell para interpretar o arquivo fornecido como um script de shell. O problema é: /etc/environment não é um script de shell. É uma lista do par de nome-valor variável de ambiente no formato:

name="value"

Essa linha, para um shell, é a definição de uma variável global , que pode ser vista apenas pelo próprio shell. Programas executados a partir do shell não podem vê-lo. A maneira correta de definir uma variável de ambiente é usando o comando export shell:

export name="value"

Então, se você realmente quiser usar o seu novo LD_LIBRARY_PATH sem sair, você deve executar o seguinte comando em vez de source /etc/environment :

export LD_LIBRARY_PATH="/opt/..."

UPDATE: LD_LIBRARY_PATH não pode ser definido em /etc/environment devido a ssh-agent . Para obter detalhes, consulte bug # 47958 e a página wiki do Ubuntu em variáveis de ambiente . Conforme especificado na página da wiki, existe uma solução alternativa e consiste em usar /etc/ld.so.conf.d .

Por exemplo, você pode criar /etc/ld.so.conf.d/opt.conf com o seguinte conteúdo:

# Paths for my cool libraries
/opt/...

Embora isso esteja listado como uma solução alternativa, ld.so.conf.d é, na verdade, o local mais apropriado para essas configurações.

    
por Andrea Corbellini 07.05.2013 / 18:38