AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 700290
Accepted
Stefan Scherfke
Stefan Scherfke
Asked: 2022-04-26 03:29:21 +0800 CST2022-04-26 03:29:21 +0800 CST 2022-04-26 03:29:21 +0800 CST

O arquivo .so existente não pode ser carregado mesmo que exista, parece depender do sistema operacional do host do Docker

  • 772

Eu construí o Qt6 em um contêiner do Docker baseado no Alma8, com o host do Docker sendo o Fedora 35.

Sob algumas circunstâncias (descritas abaixo), todas as bibliotecas Qt não podem carregar arquivos libQt6Core.so[.6[.2.4]]. Mas esse arquivo existe e o diretório correto é pesquisado para esse arquivo. Outras bibliotecas Qt (por exemplo, libQt6Dbus.so) são encontradas e carregadas.

Extensa depuração, reconstrução, pesquisa na web não forneceu nenhuma pista sobre qual é a causa subjacente e como eu poderia corrigi-la.

Localizando o problema

Eu reduzi o problema para o seguinte cenário:

  • Criei duas VMs mínimas, uma com centos7 e outra com alma8.
  • Instalei o Docker dos repositórios oficiais em ambos.
  • Executei a mesma imagem do Docker em ambas as VMs e instalei o mesmo pacote qt6.
  • Ele quebra quando o host do Docker é centos7.
  • Funciona quando o host do Docker é alma8.

Teoria e pergunta

  • O Qt6 foi construído no Alma8 e links para algumas bibliotecas de sistema mais recentes do que o Centos7 fornece, então o Qt6 não pode ser executado no Centos7 (isso é totalmente esperado e correto). Mas deve ser executado em qualquer lugar no contêiner Alma8 Docker.
  • As imagens de contêiner devem poder ser executadas em qualquer lugar, mas, neste caso, "algo" do sistema operacional host se infiltra no contêiner e causa o problema - mesmo que ambos os contêineres usem exatamente a mesma imagem!

A questão é: O que é esse "algo" e como/por que ele quebra a compilação?

O que eu tentei

Eu inspecionei libQt6Gui.sopara ver se ele pode ou não carregar libQt6Core.soe inspecionei libQt6Core.sopara ver se algo parece falso usando:

  • ldde LD_DEBUG=libs lddque de fato mostrou algumas diferenças (veja abaixo)
  • libtree que não mostrou diferenças (mas uma bela árvore :))
  • pyldd (de conda-build)
  • readelf -d

O que eu também tentei:

  • Configuração LD_LIBRARY_PATH(não mudou nada - nenhuma surpresa, pois sei que o caminho correto é sempre pesquisado)
  • Construindo o Qt6 em um contêiner alma8 com um host centos7 (falha na compilação com " libQt6Core.so.6: cannot open file", mesmo erro que com a biblioteca construída)
  • Construindo o Qt6 em um contêiner centos7 (falha na compilação devido a outros problemas que ainda não consegui corrigir)

Diferenças deldd

Nas capturas de tela abaixo, você vê o Alma8-Docker-Container em um host Centos7 à esquerda e o Alma8-Docker-Container em um host Alma8 à *direita.

As duas primeiras imagens mostram os resultados para ldd /opt/emsconda/lib/libQt6Gui.so. libQt6Corenão pode ser encontrado à esquerda, mas é encontrado à direita.

insira a descrição da imagem aqui

Esta segunda captura de tela mostra que outras bibliotecas do Qt foram encontradas e carregadas. As bibliotecas ICU também estão faltando à esquerda - talvez elas sejam carregadas apenas quando a libQt6Core também foi carregada?

insira a descrição da imagem aqui

Esta captura de tela mostra os resultados do LD_DEBUG=libs ldd .... Você pode ver que em ambos os casos, libQt6Coreestá pesquisando no local correto ( /opt/emsconda/lib). Mas só é carregado no recipiente certo. O da esquerda também procura em `/opt/emsconda/lib/./ (haha)) e então caminha silenciosamente para a próxima biblioteca ...

Não consegui encontrar nenhuma mensagem de erro. Este arquivo simplesmente não é aberto/carregado.

insira a descrição da imagem aqui

Inspecionar o libQt6Core.sopróprio pode nos dar uma pista. Ele liga a um linux-vdso.so.1.

De acordo com esta pergunta SO , esse arquivo é uma biblioteca virtual injetada no espaço do usuário pelo kernel do sistema operacional.

Como os contêineres do Docker não executam seu próprio kernel, suspeito que esse arquivo venha do sistema operacional host. Talvez, libQt6Coredependa de alguma funcionalidade no linux-vdso.so.1que o kernel centos7 não pode fornecer? Eu não faço ideia ... insira a descrição da imagem aqui


Como nada que tentei até agora gera uma mensagem de erro, não tenho ideia de qual pode ser o problema real ou como proceder com a depuração. Eu ficaria grato por qualquer tipo de dicas, dicas ou ajuda.

compiling docker
  • 1 1 respostas
  • 367 Views

1 respostas

  • Voted
  1. Best Answer
    Stefan Scherfke
    2022-04-28T05:23:28+08:002022-04-28T05:23:28+08:00

    A pergunta foi respondida nos fóruns do Qt .

    Resumo:

    • O .socontém uma tag ABI que indica a versão mínima do kernel necessária. Você pode ver isso através do objdump -s -j .note.ABI-tag libQt6Core.so.6.2.4. O resultado está nos últimos três blocos ( 0x03 0x11 0x00-> 3.17.0no meu caso).
    • Esta informação é colocada ali de propósito, já que o QT usa algumas chamadas de sistema que só estão disponíveis com kernels mais novos.
    • O Glibc lê esta informação quando carrega um objeto compartilhado e o compara com a versão atual do kernel. Se não corresponder, o arquivo não foi carregado.
    • Como o Docker não possui kernel próprio, a versão do kernel do host do Docker é usada para essa comparação. Portanto, mesmo que a imagem do Docker seja Alma8, o kernel ainda é o antigo v3.10.0 do host Centos7 no meu caso.
    • Você pode usar strip --remove-section=.note.ABI-tag libQt6Core.so.6.2.4. Qt parece ter código de fallback, então nada quebra.

    Fonte: https://github.com/Microsoft/WSL/issues/3023

    • 1

relate perguntas

  • Meson não encontra as bibliotecas do Boost

  • Como recompilar tudo eficientemente em um sistema Gentoo Linux?

  • Como instalo o docker no RHEL 7 offline?

  • Preciso executar este arquivo de script apenas uma vez?

  • O OpenVPN auto-compilado não inicia a partir do systemd

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve