compilação do PHP - link para a biblioteca

1

Eu estou compilando o PHP 5.3.13 no meu servidor. Eu quero criar uma pasta autonome php5. Então, o prefixo é:

/usr/local/php5

Nesta pasta eu tenho uma pasta lib, onde coloco toda a lib necessária para que o php seja executado como:

libk5crypto.so.3
libxml2.so.2
libjpeg.so.62 ....

Mesmo se eu compilar com --with-jpeg-dir=/usr/local/php5/lib/ , o binário do php ainda está procurando pelo arquivo em /usr/lib64 .

A única solução que encontrei até agora é exportar manualmente LD_LIBRARY_PATH=/usr/local/php5/lib

Eu gostaria do mesmo automaticamente em tempo de compilação. Isso é possível?

    
por Hugo 07.02.2013 / 12:29

1 resposta

2

Existem dois caminhos de linkers distintos, o tempo de compilação e o tempo de execução .

Eu acho que o autoconf ( configure ) é raramente configurado para fazer a coisa correta com locais de biblioteca alternativos, usando --with-something= normalmente não gera os sinalizadores de vinculador corretos ( -R ou% código%). Se você tivesse apenas -Wl,-rpath bibliotecas, funcionaria, mas para .a bibliotecas o que você precisa especificar é o .so :

export PHP_RPATHS=/usr/local/php5/lib
./configure [options as required] 

(Em muitos casos, basta anexar RPATH ao comando LDFLAGS , mas o processo de compilação do PHP é um pouco diferente.)

Isso efetivamente adiciona caminhos extras de pesquisa do vinculador a cada binário, como se esses caminhos estivessem especificados em configure ou em sua configuração de vinculador padrão ( LD_LIBRARY_PATH ). Isso também cuida da adição de /etc/ld.so.conf a -L/usr/local/php5/lib para que as bibliotecas de uso em tempo de compilação e em tempo de execução sejam do mesmo diretório (existe o potencial para problemas com versões incompatíveis em locais diferentes, mas você não precisa se preocupe aqui).

Uma vez construída, você pode verificar com:

 $ objdump -j dynamic -x ./sapi/cli/php | grep RPATH
 RPATH       /usr/local/php5/lib
 $ objdump -j dynamic -x ./libs/libphp5.so | fgrep RPATH
 RPATH       /usr/local/php5/lib

A execução de LDFLAGS também confirmará quais bibliotecas são carregadas de onde.

Para que ldd deve ser realmente usado é apontar para --with-jpeg-dir ou algum diretório de nível superior, os diretórios /usr/local/ , include/ e possivelmente outros são anexados, dependendo do que o compilador / vinculador precisa .

Você só precisa de lib/ se --with-jpeg-dir não conseguir encontrar a instalação, o configure a encontrará automaticamente em configure e em outros lugares "padrão" (possivelmente específicos da plataforma). No seu caso, acho que /usr/local está encontrando o libjpeg em um local padrão e silenciosamente desconsiderando a diretiva.

(Além disso, o PHP 5.3.13 não é mais atual, sugiro 5.3.21, a versão atual no momento.)

    
por 07.02.2013 / 14:21