Alterando a biblioteca vinculada para um determinado executável (CentOs 6)


29

Eu tenho um executável vinculado assim:

  $ ldd a.out
        libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x00007f4881f56000)
        libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4881cfb000)
        libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4881965000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f488175d000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4881540000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f4881239000)
.
.

Onde as bibliotecas libcrypto e libssl estão openssl 1.0.0-fips libs. Em vez disso, quero experimentar as bibliotecas 1.0.1 e construí-as no meu diretório pessoal. Existe uma maneira de a.outvincular minhas novas bibliotecas openssl sem muita dor? Eu gostaria de evitar

  • Ter que revincular a.out(porque as ferramentas de construção são extremamente complicadas)
  • Alterando todas as configurações globais (porque outros desenvolvedores trabalham nesta máquina)

É possível fazer o que espero aqui?

Respostas:


22

Você pode substituir temporariamente uma biblioteca diferente por essa execução específica. No Linux, a variável de ambiente LD_LIBRARY_PATH é um conjunto de diretórios separados por dois pontos em que as bibliotecas devem ser pesquisadas primeiro, antes do conjunto padrão de diretórios; isso é útil ao depurar uma nova biblioteca ou ao usar uma biblioteca não padrão para fins especiais. A variável de ambiente LD_PRELOAD lista bibliotecas compartilhadas com funções que substituem o conjunto padrão, assim como o /etc/ld.so.preload. - Bibliotecas compartilhadas

Você também pode chamar o carregador diretamente:

/lib/ld-linux.so.2 --library-path path executable


1
LD_LIBRARY_PATH não substitui o caminho de pesquisa padrão. Eu o defino, mas o ldd ainda me mostra o caminho padrão do sistema, não o substituído. Embora eu possa forçar o carregamento da minha própria biblioteca, definindo LD_PRELOAD.
Calmarius

18

Escreva um script de wrapper que defina a LD_LIBRARY_PATHvariável de ambiente. Esse é o pendente PATHpara bibliotecas compartilhadas. O caminho de pesquisa do sistema é sempre pesquisado após os diretórios listados em $LD_LIBRARY_PATH. Consulte o manual do vinculador dinâmico para referência.

#!/bin/sh
export LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib
exec /path/to/a.out "$@"

Ou, por exemplo, diretamente na linha de comando:

LD_LIBRARY_PATH=~/opt/openssl-1.0.1/lib ./a.out

Como alternativa, se você deseja modificar o binário, tente chrpath , que permite editar o caminho de pesquisa da biblioteca inserido no executável.


2
+1 para chrpath. Exatamente o que eu precisava.
Raghav RV

História fofa, a Microsoft é burra demais para gastar 2 minutos pesquisando isso e aconselha todos a usar LD_LIBRARY_PATH em vez de vincular o SQL Server ao openss-1.0.0 explicitamente ou recompilar a versão do openssl.so blogs.msdn.microsoft.com/sql_server_team /…
Evan Carroll
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.