私の問題を次のポイントまで追跡しました。私のアプリケーションを単独で実行すると正常に動作します。ところで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
は2つのライブラリ(など)で構成されています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
プログラムは、プログラムが試行/成功したファイルを表示できます(共有ライブラリのロードを含む)。