Scroll to navigation

dpkg-shlibdeps(1) dpkg suite dpkg-shlibdeps(1)

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):

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).
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:

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.
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.
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.

Inclui as dependências apropriadas para as bibliotecas partilhadas requeridas pelo executável. Esta opção pode ser usada várias vezes.
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.

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.

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.
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).
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.
Lê informação de sobreposição de dependência de biblioteca partilhada a partir de local-shlibs-file em vez de debian/shlibs.local.
Escreve variáveis de substituição em substvars-file; a predefinição é debian/substvars.
Activa o modo detalhado (desde dpkg 1.14.8). São mostradas numerosas mensagens para explicar o que o dpkg-shlibdeps faz.
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.
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.
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.
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.
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.
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.
Mostra a versão e termina.

AMBIENTE

Define o modo de cor (desde dpkg 1.18.5). Os valores actualmente aceites são: auto (predefinido), always e never.
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:

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).
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.
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).
Exactamente o mesmo que o aviso em cima, mas para múltiplos binários.
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.

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.

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-substvars(5), 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>.

2022-05-25 1.21.8