Como alterar os caminhos para bibliotecas compartilhadas (arquivos .so) para uma única instância de terminal

4

Desejo remover alguns dos caminhos que o vinculador usa para encontrar bibliotecas .so para fins de teste.

Eu encontrei uma maneira de adicionar caminhos de biblioteca:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library"

Existe uma variável semelhante a LD_LIBRARY_PATH que eu possa usar para remover caminhos de biblioteca, como /usr/local/lib ou /usr/lib , que não estão em LD_LIBRARY_PATH , mas foram selecionados pelo vinculador? Ou seja Como posso ignorar caminhos que são dados em /etc/ld.so.conf.d/?

A razão para isso é que estou ocupado criando um programa que, para um determinado executável, ele encontra recursivamente dependências da biblioteca. Eu quero ver se consigo tornar um programa mais portável encontrando todas as suas dependências, copiando essas dependências em um diretório local e fazendo um script bash de execução local para configurar o LD_LIBRARY_PATH e então executar o executável. Quero testar se esse executável de execução local funciona depois que os caminhos de pesquisa de biblioteca anteriormente importantes são removidos.

    
por Simon Streicher 26.03.2016 / 11:23

1 resposta

4

Você estaria interessado em remover caminhos de bibliotecas se uma determinada biblioteca compartilhada tivesse caminhos incorporados através do recurso rpath . Esses são adicionados no momento em que a biblioteca é criada pelo vinculador.

Você pode remover (ou alterar) esses caminhos usando chrpath , por exemplo,

chrpath -d mylibraryfile.so

A remoção de nomes de caminho da variável LD_LIBRARY_PATH também é uma possível área de interesse; você pode fazer isso por meio da substituição de string e reexportar a variável. No entanto, a questão não parece se preocupar com isso. Não há variável que aja para cancelar LD_LIBRARY_PATH .

Para ver dependências de bibliotecas, a menção de /etc/ld.so.conf.d/ faz parecer que a plataforma é apenas Linux. Você pode usar ldd para listar dependências. Além do OSX, todos os BSDs também suportam ldd . Aqui está um dos scripts que eu uso para esse propósito:

#!/bin/sh
# $Id: ldd-path,v 1.1 2007/07/09 19:30:28 tom Exp $
# Edit the output of ldd for the given parameters, yielding only the
# absolute pathnames.
ldd $* | sed \
        -e 's/([^)]*)//g' \
        -e 's/^.*=>//' \
        -e 's/[         ][      ]*//g' \
        -e '/^$/d'

Mas (endereçando um comentário), não existe nenhum mecanismo portátil para dizer ao carregador para ignorar um caminho existente. A documentação do GNU ld fornece um resumo do que é solicitado e a ordem na descrição do -rpath opção. Esses itens concluem a lista:

  • The default directories, normally /lib and /usr/lib.
  • For a native linker on an ELF system, if the file /etc/ld.so.conf exists, the list of directories found in that file.

Leitura adicional

por 26.03.2016 / 11:55