dpkg-shlibdeps
Section: dpkg suite (1)
Updated: 1970-01-01
Page Index
NOME
dpkg-shlibdeps - gera dependências substvar de biblioteca partilhada
SINOPSE
dpkg-shlibdeps [
option...] [
-e]
executable [
option...]
DESCRIÇÃO
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 de Símbolos
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
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).
OPÇÕES
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 prefixá-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.
AMBIENTE
- 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).
DIAGNÓSTICO
Avisos
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.
Erros
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.
VEJA TAMBÉM
deb-shlibs(5),
deb-symbols(5),
dpkg-gensymbols(1).
TRADUÇÃO
Américo Monteiro
Se encontrar algum erro na tradução deste documento, por favor comunique para
Américo Monteiro <a_monteiro@gmx.com>.