내 문제를 다음 지점까지 추적했습니다. 내 응용 프로그램을 단독으로 실행하면 제대로 작동합니다. 그런데 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.so
Debian(및 Ubuntu와 같은 파생 배포판) libtinfo.so
은 두 라이브러리( , 등)로 구성합니다 libtinfow.so
. 실제 파일 이름은 주/부 버전으로 끝날 수 있습니다.
libncursesw.so.6.0
이로 refresh
인해 ncurses는 하위 수준 라이브러리를 사용하여 실제 디스플레이를 업데이트하려고 시도합니다. 고급 라이브러리는 메모리에서 작업을 수행합니다.
후속 논의에 응답(반드시새로운질문),
- 정적 라이브러리를 사용하여 "항상" ncurses를 빌드할 수 있지만 그런 다음 ncurses를 사용하여 모든 애플리케이션을 다시 연결해야 합니다.
- 공유 라이브러리 문제를 해결하려면 다음이 도움이 될 수 있습니다.
ldd
그리고strace
chroot 내부에서 작동하여 (a) 경로 이름이 예상 위치에 있는지 확인하고 (b) 올바른 파일 이름을 적용합니다.
예를 들어, 애플리케이션이 "ncurses"로만 연결되는 경우
gcc -o foo foo.c -lncurses
그러면 링커는 아마도 불평하지 않을 것입니다(일부 패키저가 링커 옵션을 다음으로 설정했기 때문입니다).허용하다이)하지만 실행ldd
공유 라이브러리에서 문제가 발생할 수 있습니다.
ldd libncurses.so.6.0
이것strace
프로그램은 프로그램이 시도/성공한 파일을 표시할 수 있습니다(공유 라이브러리 로드 포함).