Se eu compilar estaticamente uma instalação do PHP a partir do código-fonte com uma quantidade métrica de extensões, a libphp5.so contém alguma dependência?

4
Basicamente, estou apenas imaginando se posso arrastar e soltar o arquivo libphp5.so para outro servidor sem o PHP e ter a funcionalidade do PHP e todas as extensões estaticamente compiladas nele. (Compilado da fonte com um monte de extensões)

Eu tentei usar a ferramenta ld no arquivo de so (no meu servidor), mas ele só cuspiu um monte de referências indefinidas. Quais são irrelevantes, já que é uma instalação funcional.

Editar:

Agora percebo que estava usando ld em vez de ldd . Agora eu obtenho uma lista das dependências. Eu estou supondo que eu precisaria de todos esses arquivos corretos? Então, minha pergunta é se eu recursivamente pegar todos os arquivos de objetos compartilhados e colocá-los em seus mesmos locais em um servidor de destino (provavelmente através de um RPM personalizado) o PHP funcionaria um novo servidor sem uma instalação formal do PHP?

Poderia estar faltando alguma dependência oculta que não seja encontrada pelo ldd?

    
por Joshua Enfield 03.12.2010 / 02:05

1 resposta

2

Uma biblioteca .so é uma biblioteca compartilhada - exatamente o oposto de uma biblioteca estática. Se você compilar estaticamente uma instalação do PHP, você terá um único executável (muito grande), provavelmente chamado "php", mas não haverá arquivos .so.

Eu acredito que não é possível (ou pelo menos uma idéia muito ruim) compilar "estaticamente" um arquivo .so. A razão é que você estará efetivamente copiando centenas, se não milhares, de funções para o arquivo .so, o que não apenas o tornará enorme, mas também poderá causar erros quando a biblioteca for carregada. Por exemplo, se uma aplicação (como um servidor web) carrega a biblioteca C padrão com a função strcpy (), então ela carrega seu arquivo .so 'static' que também tem uma função strcpy (), ser um conflito. Você poderia contornar isso exportando cuidadosamente apenas os símbolos necessários ou usando dlopen () no aplicativo, mas na melhor das hipóteses você acabará com um arquivo maciço de tamanho grande que desperdiça muita memória.

O que você pode fazer é usar ldd para selecionar todos os arquivos .so necessários para executar todas as extensões e colocá-los todos na mesma pasta do arquivo .so. Se você definir a variável de ambiente LD_LIBRARY_PATH para esse diretório antes de executar um aplicativo, ele deverá selecionar o PHP e todas as suas dependências a partir dessa pasta. Isso não lhe daria a abordagem mágica de arquivo único, mas pelo menos permitiria que você contivesse tudo em uma pasta.

    
por 04.05.2011 / 03:33