Adicionando isso como outra resposta, porque o outro ainda pode ficar por conta própria, mas o seu problema (depois de esclarecido) é diferente. Se isso é sobre bibliotecas que são enviadas com seu aplicativo e também pelo sistema, a situação não é comparável. Você está quase no que precisa fazer para consertar, mas não completamente: -)
Existem várias soluções para o seu problema: LD_LIBRARY_PATH
, rpath
, envio de bibliotecas alteradas e compilação várias vezes. Cada um tem suas vantagens e problemas, então deixe-me explicar:
-
LD_LIBRARY_PATH
Se você percorrer esse caminho, defina uma variável de ambiente antes de executar o programa. Ele provavelmente requer que você use um script de wrapper em torno do seu binário (ou seja, em vez de executar diretamente o
/path/to/my/php
, você executa um script de shell que defineLD_LIBRARY_PATH
e executa/path/to/my/php
).A desvantagem desse método é que ele é um pouco frágil:
-
LD_LIBRARY_PATH
é prefixado no caminho de pesquisa da biblioteca, mas não o substitui. Isso significa que, se as bibliotecas em questão estiverem instaladas em todo o sistema, mas por algum motivo as que você enviou não puderem ser carregadas, o vinculador dinâmico recorrerá às fornecidas pelo sistema. - O requisito para chamar um script de shell significa que você tem uma chamada fork / exec extra, o que pode fazer com que as coisas corram mal. Isso pode ser atenuado de alguma forma usando o comando
exec
em seu script de shell (para que o script seja substituído pelo binário php e para que seu programa php seja um filho adequado do pai), mas ainda é confuso
Por outro lado, permite alguma flexibilidade com o local onde você armazena suas bibliotecas (ou seja, se o sistema fornecido for bom o suficiente em alguns casos, tudo bem se você removê-lo do diretório
LD_LIBRARY_PATH
) -
-
rpath
Aqui, a idéia é que você diga ao compilador (por meio de
gcc -Wl,-rpath,'/path/to/library'
) exatamente onde procurar pela biblioteca. Isso é embutido no programa em tempo de compilação, e o vinculador dinâmico ignorará absolutamente as versões da biblioteca que estão fora do seu fornecidorpath
, incluindo as versões fornecidas pelo sistema. Isso evita a bagunça doLD_LIBRARY_PATH
acima, mas a desvantagem é que isso torna as coisas menos flexíveis; se você precisar mover as coisas no sistema de arquivos, você precisará recompilar tudo.Isso também significa que, se seus usuários quiserem ver as coisas instaladas de uma maneira diferente, eles não terão sorte. Eles podem não gostar disso.
Ambos os métodos estão documentados na página ld.so
man.
-
Envio de bibliotecas alteradas
Aqui, a ideia é que, em vez de tentar vincular a
libk5crypto.so.3
, você vincule alibmycorp-k5crypto.so.3
. Não haverá chance alguma do vinculador dinâmico pegar olibk5crypto.so.3
fornecido pelo sistema nesse caso. A vantagem aqui é que é bastante fácil e elegante, uma vez instalado; A desvantagem é que as pessoas podem começar a se perguntar se você alteroulibk5crypto
(e solicitará patches), e também precisará mergulhar fundo no sistemalibk5crypto.so
build para fazer com que ele realmente emita uma bibliotecalibmycorp-k5crypto.so
. Também pode parecer ruim a longo prazo, então tenha cuidado antes de seguir esse caminho. -
Compilando várias vezes
Em vez de distribuir as bibliotecas que também são fornecidas em todo o sistema, você pode apenas compilar seu aplicativo em todas as distribuições suportadas e enviar um pacote para toda e qualquer distribuição, em vez de distribuir suas bibliotecas. Coisas como packagecloud.io tornam isso mais fácil de fazer. Como existe apenas uma biblioteca com um nome no sistema, há apenas uma biblioteca para escolher e nenhuma chance de escolher a biblioteca errada. A desvantagem é que você tem um leque maior de coisas para testar, então você tem mais trabalho no momento do lançamento (e é melhor ter uma boa suíte de testes).
A vantagem é que esse método garante o envio de menos do que você faria (assim, você tem menos suporte) e pode informar aos usuários que estão em uma distribuição que possui uma versão mais antiga de
libk5crypto.so
que você não possui mais suporte, que eles devem atualizar isso primeiro.