dpkg-shlibdeps - gera dependências substvar de biblioteca
partilhada
dpkg-shlibdeps [option...] [-e]
executable [option...]
dpkg-shlibdeps calcula dependências de bibliotecas
partilhadas para executáveis nomeados nos seus argumentos. As
dependências são adicionadas ao ficheiro de variáveis
de substituição debian/substvars como nomes de
variáveis shlibs:dependency-field onde
dependency-field é um nome de campo de dependência.
Quaisquer outras variáveis começadas com shlibs:
são removidas do ficheiro.
dpkg-shlibdeps tem duas possíveis fontes de
informação para gerar a informação de
dependências. Seja ficheiros symbols ou ficheiros
shlibs. Para cada binário que o dpkg-shlibdeps analise,
ele encontra a lista de binários com que tem links. Depois, para cada
biblioteca, procura pelo ficheiro symbols, ou pelo ficheiro
shlibs (se o anterior não existir ou se debian/shlibs.local
conter a dependência relevante). Ambos ficheiros são supostos
serem fornecidos pelo pacote biblioteca e devem assim estarem
disponíveis como as /var/lib/dpkg/info/package.symbols
ou /var/lib/dpkg/info/package.shlibs. O nome do pacote
é identificado em dois passos: encontrar o ficheiro biblioteca no
sistema (procurando nos mesmos directórios que ld.so iria
usar), depois usar dpkg -S library-file para procurar o pacote
que fornece a biblioteca.
Ficheiros Symbols contêm informação de
dependências afinada ao fornecerem a dependência mínima
para cada símbolo que a biblioteca exporta. O script tenta encontrar
um ficheiro de símbolos associado a um pacote biblioteca nos
seguintes locais (é usada a primeira correspondência):
- debian/*/DEBIAN/symbols
- Informação de biblioteca partilhada gerada pelo actual
processo de compilação que também invocou
dpkg-shlibdeps. São gerados por dpkg-gensymbols(1).
São apenas usados se a biblioteca for encontrada na árvore
de compilação do pacote. O ficheiro de símbolos nessa
árvore de compilação toma precedência sobre
ficheiros de símbolos de outros pacotes binários.
- /etc/dpkg/symbols/package.symbols.arch
- /etc/dpkg/symbols/package.symbols
- Informação de sobreposição por-sistema de
dependência de biblioteca partilhada. arch é a
arquitectura do sistema actual (obtida por dpkg-architecture
-qDEB_HOST_ARCH).
- Resultado de
“dpkg-query --control-path package
symbols”
- Informação de dependências de bibliotecas partilhadas
fornecidas pelo pacote. A menos que sobrepostas por --admindir,
esses ficheiros estão localizados em /var/lib/dpkg.
Enquanto sonda os símbolos usados por todos os
binários, o dpkg-shlibdeps lembra-se da versão
mínima (mais alta) necessária para cada biblioteca. No final
do processo, é capaz de escrever a dependência mínima
para cada biblioteca usada (desde que a informação dos
ficheiros symbols esteja exacta).
Como medida de salva-guarda, um ficheiro de símbolos pode
fornecer um campo de meta-informação
Build-Depends-Package e dpkg-shlibdeps irá extrair a
versão mínima requerida pelo pacote correspondente no campo
Build-Depends e usa esta versão se for maior que a
versão mínima computada pela sondagem dos símbolos.
Ficheiros Shlibs associam directamente uma biblioteca a uma
dependência (sem olhar para os símbolos). É assim
geralmente mais forte do que realmente necessário mas muito seguro e
fácil de manusear.
As dependências por uma biblioteca são procuradas em
vários lugares. É usado o primeiro ficheiro que providencia
informação para a biblioteca que interessa:
- debian/shlibs.local
- Informação de dependência de biblioteca partilhada
que sobrepõe pacote local
- /etc/dpkg/shlibs.override
- Informação de dependência de biblioteca partilhada de
sobreposição por sistema.
- debian/*/DEBIAN/shlibs
- Informação de biblioteca partilhada gerada pelo actual
processo de compilação que também invocou
dpkg-shlibdeps. São apenas usados se a biblioteca for
encontrada na árvore de compilação do pacote. O
ficheiro shlibs nessa árvore de compilação toma
precedência sobre ficheiros shlibs de outros pacotes
binários.
- Resultado de
“dpkg-query --control-path package
shlibs”
- Informação de dependências de bibliotecas partilhadas
fornecidas pelo pacote. A menos que sobrepostas por --admindir,
esses ficheiros estão localizados em /var/lib/dpkg.
- /etc/dpkg/shlibs.default
- Informação de dependência de biblioteca partilhada
predefinida por sistema.
as dependências extraídas são depois usadas
directamente (excepto se forem filtradas porque foram identificadas como
duplicadas, ou como mas fracas que outra dependência).
dpkg-shlibdeps interpreta argumentos
não-opção como nomes executáveis, como se eles
fosse fornecidos como -eexecutable.
- -eexecutable
- Inclui as dependências apropriadas para as bibliotecas partilhadas
requeridas pelo executável. Esta opção pode
ser usada várias vezes.
- -ldirectory
- Adiciona directory ao inicio da lista de directórios a
pesquisar por bibliotecas partilhadas privadas (desde dpkg 1.17.0). Esta
opção pode ser usada várias vezes.
Nota: Use esta opção em vez de definir
LD_LIBRARY_PATH, pois essa variável de ambiente é
usado para controlar o vinculador de tempo-de-execução e
abusar dela para definir caminhos de bibliotecas partilhadas durante a
compilação pode ser problemático quando, por
exemplo, se faz compilações cruzadas.
- -ddependency-field
- Todas as dependências a serem adicionadas ao campo de
dependências do ficheiro de controle dependency-field. (As
dependências para este campo são colocadas na
variável shlibs:dependency-field.)
A opção -ddependency-field produz
efeito para todos os executáveis após a
opção, até ao próximo
-ddependency-field. A predefinição de
dependency-field é Depends.
Se a mesma entrada de dependência (ou conjunto de
alternativas) aparecer em mais do que um dos nomes de campos de
dependência reconhecida Pre-Depends, Depends,
Recommends, Enhances ou Suggests então
dpkg-shlibdeps irá remover automaticamente a
dependência de todos os campos excepto daquele que representa as
dependências mais importantes.
- -pvarname-prefix
- Começa as variáveis de substituição com
varname-prefix: em vez de shlibs:. Do mesmo modo,
quaisquer variáveis de substituição existentes que
comecem com varname-prefix: (em vez de shlibs:)
são removidas do ficheiros de variáveis de
substituição.
- -O[filename]
- Escreve as definições de variáveis de
substituição na saída standard (ou filename se
especificado, desde dpkg 1.17.2), em vez de serem adicionadas ao ficheiro
de variáveis de substituição (debian/substvars
por predefinição).
- -ttype
- Informação etiquetada de dependência de biblioteca
partilhada preferida para o tipo de pacote dado. Se não existir
informação etiquetada, cai para a informação
não etiquetada. O tipo de pacote predefinido é deb. A
informação de dependência de biblioteca partilhada
é etiquetada para um determinado tipo ao prefixa-la com o nome to
tipo, dois pontos, e espaço em branco.
- -Llocal-shlibs-file
- Lê informação de sobreposição de
dependência de biblioteca partilhada a partir de
local-shlibs-file em vez de debian/shlibs.local.
- -Tsubstvars-file
- Escreve variáveis de substituição em
substvars-file; a predefinição é
debian/substvars.
- -v
- Activa o modo detalhado (desde dpkg 1.14.8). São mostradas
numerosas mensagens para explicar o que o dpkg-shlibdeps faz.
- -xpackage
- Exclui o pacote das dependências geradas (desde dpkg 1.14.8). Isto
é útil para evitar auto-dependências para pacotes que
fornecem binários ELF (executáveis ou plugins biblioteca)
usando uma biblioteca contida no mesmo pacote. Esta opção
pode ser usada várias vezes para excluir vários
pacotes.
- -Spackage-build-dir
- Procura primeiro em package-build-dir quando tenta encontrar uma
biblioteca (desde dpkg 1.14.15). Isto é útil quando o pacote
fonte compila vários sabores da mesma biblioteca e você quer
assegurar que obtém a dependência a partir de um determinado
pacote binário. Você pode usar esta opção
várias vezes: directórios serão tentados na mesma
ordem antes de directórios de outros pacotes binários.
- -Ipackage-build-dir
- Ignora package-build-dir quando procurar por shlibs, symbols, e
ficheiros de biblioteca partilhada (desde dpkg 1.18.5). Você pode
usar esta opção várias vezes.
- --ignore-missing-info
- Não falha se a informação de dependência
não pode ser encontrada para uma biblioteca partilhada (desde dpkg
1.14.8). A utilização desta opção é
desencorajada, todas as bibliotecas devem fornecer
informação de dependências (seja com ficheiros
shlibs, ou com ficheiros symbols) mesmo se ainda não forem usadas
por outros pacotes.
- --warnings=value
- value é um campo de bit que define o conjunto de avisos que
podem ser emitidos pelo dpkg-shlibdeps (desde dpkg 1.14.17). Bit 0
(valor=1) activa o aviso “symbol sym usado por binary
encontrado em nenhuma das bibliotecas, bit 1 (valor=2) activa o aviso
“pacote podia evitar uma dependência inútil” e
bit 2 (valor=4) activa o aviso “binary não deveria
estar em link contra library”. O value predefinido
é 3: os dois primeiros avisos estão activos por
predefinição, o último não está. Defina
value para 7 se deseja ter todos os avisos activos.
- --admindir=dir
- Altera a localização da base de dados do dpkg (desde
dpkg 1.14.0). A localização predefinida é
/var/lib/dpkg.
- -?, --help
- Mostra a mensagem de utilização e termina.
- --version
- Mostra a versão e termina.
- DPKG_COLORS
- Define o modo de cor (desde dpkg 1.18.5). Os valores actualmente aceites
são: auto (predefinido), always e never.
- DPKG_NLS
- Se definida, será usada para decidir se deve activar o Suporte a
Linguagem Nativa. Também como conhecido como suporte de
internacionalização (ou i18n) (desde dpkg 1.19.0). Os
valores aceites são 0 e 1
(predefinição).
Como o dpkg-shlibdeps analisa o conjunto de símbolos
usados por cada binário do pacote gerado, é capaz de emitir
avisos em vários casos. Eles informam-o de coisas que podem ser
melhoradas no pacote. Na maioria dos casos, esses melhoramentos interessam
directamente às fontes do autor. Por ordem de importância
descendente, aqui estão os vários avisos que você pode
encontrar:
- symbol sym
used by binary found in none of the libraries.
- O símbolo indicado não foi encontrado nas bibliotecas em
link com o binário. O binary é mais certamente uma
biblioteca e precisa de ser ligada em link com uma biblioteca adicional
durante o processo de compilação (opção
-llibrary do vinculador).
- binary contains
an unresolvable reference to symbol sym: it's probably a
plugin
- O símbolo indicado não foi encontrado nas bibliotecas em
link com o binário. O binary é mais certamente um
plugin e o símbolo é provavelmente fornecido pelo programa
que carrega este plugin. Em teoria um plugin não tem nenhum SONAME
mas este binário tem um e como tal ele não pôde ser
claramente identificado como tal. No entanto, o facto de que o
binários está armazenado num directório
não-público é uma forte indicação que
não é uma biblioteca partilhada normal. Se o binário
é mesmo um plugin, então esqueça este aviso. Mas
há sempre a possibilidade que seja uma biblioteca real e que esses
programas em link com ela estejam a usar uma RPATH para que o carregador
dinâmico as encontre. Nesse caso, a biblioteca está quebrada
e precisa de ser reparada.
- package could avoid a
useless dependency if binary was not linked against
library (it uses none of the library's symbols)
- Nenhum dos binaries que estão em link com library
usam qualquer dos símbolos fornecidos pela biblioteca. Ao corrigir
todos os binários, você deveria evitar a dependência
associada a esta biblioteca (a menos que a mesma dependência seja
também gerada por outra biblioteca que seja realmente usada).
- package could
avoid a useless dependency if binaries were not linked
against library (they use none of the library's
symbols)
- Exactamente o mesmo que o aviso em cima, mas para múltiplos
binários.
- binary
should not be linked against library (it uses none of the
library's symbols)
- O binary está ligado em link com uma biblioteca que
não precisa. Não é um problema mas pode-se obter
algum pequeno melhoramento de performance no tempo de carga do
binário se não se ligar esta biblioteca a este
binário. Este aviso verifica a mesma informação que o
anterior mas fá-lo para cada binário em vez de fazer as
verificações globalmente para todos os binários
analisados.
dpkg-shlibdeps irá falhar se não conseguir
encontrar uma biblioteca pública usada por um binário ou se
esta biblioteca não tiver informação de
dependência associada (seja um ficheiro shlibs ou symbols). Uma
biblioteca pública tem um SONAME e é versionado
((libsomething.so.X). Uma biblioteca privada (como um plugin)
não deve ter um SONAME e não precisa de ser versionada.
- couldn't find
library library-soname needed by binary (its
RPATH is 'rpath')
- O binary usa uma biblioteca chamada library-soname mas o
dpkg-shlibdeps não foi capaz de encontrar a biblioteca.
dpkg-shlibdeps cria uma lista de directórios a verificar
como se segue: directórios listados na RPATH do binário,
directórios adicionados pela opção -l,
directórios listados na variável de ambiente
LD_LIBRARY_PATH, directórios de multi-arquitectura cruzada
(ex. /lib/arm64-linux-gnu, /usr/lib/arm64-linux-gnu), directórios
públicos standard (/lib, /usr/lib), directórios listados em
/etc/ld.so.conf, e directórios multilib obsoletos (/lib32,
/usr/lib32, /lib64, /usr/lib64). Depois verifica esses directórios
na árvore de compilação do pacote do binário a
ser analisado, nas árvores de compilação dos pacotes
indicados com a opção de linha de comandos -S, nas
árvores de compilação de outros pacotes que
contêm um ficheiro DEBIAN/shlibs ou DEBIAN/symbols e finalmente no
directório raiz. Se a biblioteca não for encontrada em
nenhum destes directórios, então você vai obter este
erro.
Se a biblioteca não encontrada está num
directório privado do mesmo pacote, então você tem
de adicionar o directório com -l. Se está noutro
pacote binário a ser compilado, então você tem de
certificar-se que o ficheiro shlibs/symbols deste pacote já
está criado e que o -l contém o directório
apropriado se estiver também num directório privado.
- no dependency information found
for library-file (used by binary).
- A biblioteca necessária pelo binary foi encontrada pelo
dpkg-shlibdeps em library-file mas dpkg-shlibdeps
não foi capaz de encontrar nenhuma informação de
dependência para essa biblioteca. Para encontrar a
dependência, tentou mapear a biblioteca a um pacote Debian com a
ajuda de dpkg -S library-file. Depois verificou os ficheiros
shlibs e symbols correspondentes em /var/lib/dpkg/info/, e nas
várias árvores de compilação de pacotes
(debian/*/DEBIAN/).
Esta falha pode ser causada por um ficheiro shlibs ou symbols
mau ou em falta no pacote da biblioteca. Também pode acontecer se
a biblioteca for compilada dentro do mesmo pacote fonte e se os
ficheiros shlibs ainda não foram criados (que neste caso
você tem de corrigir debian/rules para criar o shlibs antes de
chamar dpkg-shlibdeps). Uma má RPATH também pode
levar a que a biblioteca seja encontrada sob um nome
não-canónico (exemplo:
/usr/lib/openoffice.org/../lib/libssl.so.0.9.8 em vez de
/usr/lib/libssl.so.0.9.8) que não está associado a nenhum
pacote, o dpkg-shlibdeps tenta contornar isto ao tentar descer
para um nome canónico (usando realpath(3)) mas pode nem
sempre funcionar. É sempre melhor limpar a RPATH do
binário para evitar problemas.
Chamar o dpkg-shlibdeps em modo detalhado (-v)
irá providenciar muito mais informação acerca de
onde ele tentou encontrar a informação de
dependência. Isto pode ser útil se você não
perceber porquê está a dar-lhe este erro.
Américo Monteiro
Se encontrar algum erro na tradução deste documento,
por favor comunique para Américo Monteiro
<a_monteiro@gmx.com>.