Que bibliotecas / arquivos são necessários para o ncurses refresh () em um ambiente chroot no Ubuntu 16.04

1

Eu rastreei meu problema até o seguinte ponto. Se eu executar meu aplicativo por si só, funciona bem. No entanto, se eu chroot , parece funcionar bem até que o jogo atual termina e, em seguida, o core despeja chamando a função refresh() . Alguém pode me dar algumas dicas sobre o que a função refresh() pode estar precisando e que não está no ambiente chroot ?

Eu tenho esse código chamando-o:

move(My_pos.y, My_pos.x);
printw("AARRrrgghhhh....");
move(My_pos.y+1, My_pos.x); /* ZZZ */
printw("before refresh"); /* ZZZ */
refresh();
move(My_pos.y+1, My_pos.x); /* ZZZ */
printw("done with refresh"); /* ZZZ */

As linhas ZZZ são o que comprova o erro - o "before refresh" funciona de qualquer forma, mas o "done with refresh" ocorre apenas na chamada que não é chroot. No chroot, core dumps ...

Alguma idéia?

    
por Marisa Giancarla 17.11.2017 / 00:26

1 resposta

4

Você pode ter copiado apenas a biblioteca de alto nível, por exemplo, libncurses.so ou libncursesw.so , mas o Debian (e distribuições derivadas como o Ubuntu) o configuram com duas bibliotecas ( libtinfo.so , libtinfow.so , etc. ). O nome do arquivo real provavelmente termina com a versão principal / secundária, como

libncursesw.so.6.0

O refresh faz com que as ncurses tentem atualizar a exibição real; que usa a biblioteca de baixo nível. A biblioteca de alto nível faz seu trabalho na memória.

Respondendo à discussão de acompanhamento (que deve ser uma nova pergunta),

  • você pode "sempre" criar ncurses com bibliotecas estáticas, mas então teria que vincular novamente qualquer aplicativo usando ncurses.
  • para solucionar problemas com bibliotecas compartilhadas, você pode achar útil ter ldd e strace funcionando dentro do chroot, para (a) demonstrar que o nomes de caminho são onde eles são esperados, e (b) os nomes de arquivos corretos são executados.

Se o seu aplicativo foi vinculado apenas a "ncurses", por exemplo,

gcc -o foo foo.c -lncurses

então o vinculador pode não reclamar (já que alguns empacotadores definem as opções do vinculador para permitir isso), mas executar ldd na biblioteca compartilhada pode mostrar um problema,

ldd libncurses.so.6.0

O programa strace pode mostrar quais arquivos (incluindo carregar bibliotecas compartilhadas) o programa tenta / obtém.

    
por 17.11.2017 / 01:04