Ignore ld_library_path e siga com a biblioteca dada através do -rpath na hora do link
-
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.
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?