<環境> CentOS4 + prelink 0.3.3-1.EL4
8/24にprelinkがバージョンアップされて以来、8/25以降のcronのログに以下のエラーが出ていた。
/etc/cron.daily/prelink: line 47: xxxx Aborted /usr/sbin/prelink -av $PRELINK_OPTS >>/var/log/prelink.log 2>&1 |
prelinkは共有ライブラリ(shared library)をリンクしたプログラムの起動時間を短縮するため、プログラムからリンク情報を取り出し、事前にシンボル名やパスなどを解決し、ライブラリを仮想メモリ空間に配置しておくプログラム。
プログラムやライブラリのアップデートのたびprelinkしなおさなければならないため、毎日1回cronで実行されている。
ところが、8/24に次のバージョンのprelinkにアップデートされ、このエラーが吐き出されるようになった。当然prelinkも実行されない。
/var/log/yum.log
Aug 24 05:44:56 Updated: prelink.i386 0.3.3-1.EL4 |
/var/log/prelink.log を見ると、以下のようなコマンドを実行してAbortしている。
/usr/sbin/prelink -av -mR -f : Prelinking /usr/X11R6/lib/xscreensaver/hypertorus /usr/sbin/prelink: /usr/X11R6/lib/xscreensaver/hypertorus: Cannot prelink against non-PIC shared library /usr/X11R6/lib/libGL.so.1 Prelink failed with return value 134 |
non-PIC shared library がprelinkできない、というのは既知の問題としてgentooのサイトに掲載されている。だが、今までもこれで問題なく動作完了していたし、もう1台のサーバーでは同じバージョンのprelinkが正常に動作しているので原因は他にありそうだ。
* libGL.soは、xorg-x11-Mesa-libGL に含まれており、デフォルトでX11に含まれているものはshared library ではないためprelinkできない。
すべてのprelinkをいったん元の状態に戻す。
http://www.astro.phys.s.chiba-u.ac.jp/~oda/html/linux_memo/linux_04_memo/linux_oct/prelink-howto.xml.html
# prelink -uma /usr/sbin/prelink: /usr/local/lib/libpcre.so.0.0.1 is not present in any config file directories, nor was specified on command line /usr/sbin/prelink: /usr/local/lib/libpcreposix.so.0.0.0 is not present in any config file directories, nor was specified on command line /usr/sbin/prelink: /usr/local/pgsql/lib/libpq.so.5.0 is not present in any config file directories, nor was specified on command line /usr/sbin/prelink: /usr/local/lib/libfreetype.so.6.3.11 is not present in any config file directories, nor was specified on command line |
期待するパスにライブラリが存在しないといっているが、実際には存在している。ただ、とにかく何かまずいことになっているのだろう。これについては、別途rkhunterでチェックする。
この後、再度prelinkを実行
# /etc/cron.daily/prelink (実際には、以下のコマンドを実行している。) # /usr/sbin/prelink -av -mR -f : Prelinking /usr/X11R6/lib/xscreensaver/hypertorus |
Abortせずに実行完了 lol
正常動作したようなので、あとはWatch
以下、prelinkのオプション。詳しくは man prelinkで。
オプション | 内容 |
-R | ライブラリのアドレス順序がランダムになる
buffer overflowに対するセキュリティ対策 |
-a | すべてのバイナリをprelink |
-f | すでにprelinkされているバイナリも再度prelinkする
依存しているライブラリが変更された場合は、prelinkの上書きとなる |
-m | 仮想メモリ空間を確保 |
-u | prelinkしたバイナリやライブラリをprelinkする前の状態に戻す |
* 全システムをprelinkするには最低50MBのフリースペースが必要
* position independent version libGL.soをインストールするか、libGL.soにパッチをあてれば、non-PIC shared library がprelinkできない問題は解決できる。
* 上記でだめなら、prelink -u を実行する
詳しくは、Gentoo Linux Prelinkガイド