Ubuntu 16.04 chroot 환경에서 ncurses 새로 고침()에는 어떤 라이브러리/파일이 필요합니까?

Ubuntu 16.04 chroot 환경에서 ncurses 새로 고침()에는 어떤 라이브러리/파일이 필요합니까?

내 문제를 다음 지점까지 추적했습니다. 내 응용 프로그램을 단독으로 실행하면 제대로 작동합니다. 그런데 chroot이렇게 하면 현재 게임이 끝날 때까지 잘 되는 것 같더니, 그 이후에는 refresh()코어 덤프에 함수를 호출하게 됩니다. 누군가 refresh()이 함수에 필요할 수 있지만 환경에는 없는 것에 대한 조언을 줄 수 있습니까 chroot?

나는 그것을 호출하는이 코드를 가지고 있습니다 :

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 */

ZZZ 라인은 오류를 증명합니다. "새로 고침 전"은 어느 쪽이든 작동하지만 "새로 고침 완료"는 chroot가 아닌 호출에서만 발생합니다. chroot에서는 코어 덤프가...

어떤 아이디어가 있나요?

답변1

libncurses.so, 또는 와 같은 상위 수준 라이브러리를 방금 복사했을 수도 있지만 libncursesw.soDebian(및 Ubuntu와 같은 파생 배포판) libtinfo.so은 두 라이브러리( , 등)로 구성합니다 libtinfow.so. 실제 파일 이름은 주/부 버전으로 끝날 수 있습니다.

libncursesw.so.6.0

이로 refresh인해 ncurses는 하위 수준 라이브러리를 사용하여 실제 디스플레이를 업데이트하려고 시도합니다. 고급 라이브러리는 메모리에서 작업을 수행합니다.

후속 논의에 응답(반드시새로운질문),

  • 정적 라이브러리를 사용하여 "항상" ncurses를 빌드할 수 있지만 그런 다음 ncurses를 사용하여 모든 애플리케이션을 다시 연결해야 합니다.
  • 공유 라이브러리 문제를 해결하려면 다음이 도움이 될 수 있습니다.ldd그리고stracechroot 내부에서 작동하여 (a) 경로 이름이 예상 위치에 있는지 확인하고 (b) 올바른 파일 이름을 적용합니다.

예를 들어, 애플리케이션이 "ncurses"로만 연결되는 경우

gcc -o foo foo.c -lncurses

그러면 링커는 아마도 불평하지 않을 것입니다(일부 패키저가 링커 옵션을 다음으로 설정했기 때문입니다).허용하다이)하지만 실행ldd공유 라이브러리에서 문제가 발생할 수 있습니다.

ldd libncurses.so.6.0

이것strace프로그램은 프로그램이 시도/성공한 파일을 표시할 수 있습니다(공유 라이브러리 로드 포함).

관련 정보