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.
deb-substvars(5),
deb-shlibs(5),
deb-symbols(5),
dpkg-gensymbols(1).
Américo Monteiro
Se encontrar algum erro na tradução deste documento, por favor
comunique para Américo Monteiro <
[email protected]>.