私はこれに以前気づいたようですが、実際に考えたことはありません。今は気になります。
> ldd /bin/bash
linux-vdso.so.1 => (0x00007fff2f781000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f0fdd9a9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f0fdd7a5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f0fdd3e6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0fddbf6000)
Libtinfoはncursesの一部です。これはFedoraシステムですが、Ubuntuでも同じです。 raspbian(Debianのバリエーション)では、libncurses自体にも接続されることがわかりました。
その理由は何ですか?私はbashがすることはすべてlibreadline(奇妙なことに接続されていない)で行うことができると思います。これは単なる代替品ですか?
ベストアンサー1
次のように実行する場合bash
:
LD_DEBUG=bindings bash
GNUシステムとbash.*tinfo
grep for出力で次のようなものを見ることができます。
797: binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `UP'
797: binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `PC'
797: binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `BC'
797: binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetent'
797: binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetstr'
797: binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetflag'
tinfoのこれらのシンボルが使用されてnm -D /bin/bash
いることを出力で確認できます。bash
これらのシンボルを提供するマニュアルページでは、そのシンボルの目的を明確にすることができます。
$ man tgetent
NAME
PC, UP, BC, ospeed, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs -
direct curses interface to the terminfo capability database
デフォルトではbash
、readline
静的にリンクされたlibreadlineエディタはそれを使用してターミナル機能のterminfoデータベースを照会して、ラインエディタをすべてのデバイスで正しく実行できます(正しいエスケープシーケンスを送信してキーを正しく識別します)。端末。
readlineがなぜ静的にリンクされているのかについては、同じ人が一緒に開発し、に含まれていることを覚えておく必要がありますbash
。readline
bash
bash
bash
システムにインストールされているバージョンへのリンクを構築することは可能ですlibreadline
が、バージョンが互換性のあるバージョンであり、これがデフォルト以外の場合にのみ可能です。configure
コンパイル時に使用する必要があります--with-installed-readline
。