這原本是不會造成什麼問題,因為 make world 之後舊的 library 還是會保留下來。不過有一天好死不好,重新看了 /usr/src/UPDATING, 手賤執行了 make delete-old 和 make delete-old-libs,想要清除一些升級後的遺跡,然後就發現有些 package 無法執行,因為 libc.so.6 不見了。
無法執行當然不是什麼問題,ports 重新 compile 一份就好了。問題是,總不能等執行後發現不能用時,才來 compile。那多不切實際啊。何況有些程式是 X window 下在用的,哪天莫名奇妙出問題,想破頭也不會發現問題在這。所以還是自己先來大掃除一番。
主角1: ldd 找出執行檔link 到哪去
主角2: pkg_which 找出執行檔是誰家 ports 的小孩
主角3: portupgrade
1. find executables linked to old libraries:
# ldd /usr/local/bin/* | less
output like this:
/usr/local/bin/xmlwf:
libexpat.so.6 => /usr/local/lib/libexpat.so.6 (0x2807f000)
libc.so.6 => not found (0x0)
the "not found" is your target.
2. find the package it belongs to
# pkg_which /usr/local/bin/xmlwf
expat-2.0.0_1
So it belongs to expat.
3. force to recompile it
# portupgrade -f expat-2.0.0_1
That's it!
Make it shorter by putting 2. and 3. together:
# portupgrade -f `pkg_which /usr/local/bin/xmlwf`
目前還沒有想到如何把 1. 也三步併一步, unix command 用得不熟 XD 如有能人敬請不吝告知。我想應該要用到 perl python 或 ruby 這一類處理文字比較行的工具,不過我都不會 XD
沒有留言:
張貼留言