Ignore ld_library_path e siga com a biblioteca dada através do -rpath na hora do link

StackOverflow https://stackoverflow.com/questions/2408172

  •  18-09-2019
  •  | 
  •  

Pergunta

Estou sentado em um ambiente sobre o qual não tenho controle real (não sou apenas eu, então, basicamente, não posso mudar o ambiente ou não funcionará para mais ninguém), a única coisa que posso afetar é como o O binário é construído.

Meu problema é que o ambiente especifica um ld_library_path contendo um libstdc ++ que não é compatível com o compilador sendo usado. Tentei compilá -lo estaticamente, mas isso não parece possível para G ++ (versão 4.2.3, parece ter sido feito nessa direção em versões posteriores, que não estão disponíveis, -static -LIBSTDC ++ ou algo assim).

Agora eu cheguei ao uso do RPath para assar o nome do caminho absoluto no executável (funcionaria, todas as máquinas em que ele deve executar são idênticas). Infelizmente, parece que ld_library_path tem precedência sobre o RPath (redefinir ld_library_path confirmou que é capaz de encontrar a biblioteca, mas como afirmado acima, ld_library_path será definido para todos, e eu não posso mudar isso).

Existe alguma maneira de fazer o RPath ter precedência sobre LD_Library_Path, ou existem outras soluções possíveis para o meu problema? Observe que estou falando de vinculação dinâmica em tempo de execução, sou capaz de controlar a linha de comando no tempo de compilação e link.

Obrigado.

Foi útil?

Solução

Vincular contra libstdc++.a é definitivamente possível, embora complicado. Instruções aqui.

Estou um pouco cético em relação à sua afirmação de que LD_LIBRARY_PATH tem precedência sobre o "assado em" DT_RPATH embora - pelo menos no Linux e (acredito) Solaris, LD_LIBRARY_PATH é apenas visto depois DT_RPATH A pesquisa falhou.

Outras dicas

Talvez você possa usar um invólucro de shell que modifique o ambiente apenas para este programa?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

Isso deve sobrecarregar o ld_library_path antes da execução e substituir o invólucro pelo seu binário via exec.

Isso ajudaria?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top