2006年9月11日 星期一

How to find out executables linked to obsoleted libraries and upgrade them

很久很久以前...當 FreeBSD 6.0 Release 時,current 的版號理所當然要向前推進到 7, libc.so 的傳統是跟著主要版號更動,所以 libc.so.6 也就變成了 libc.so.7。

這原本是不會造成什麼問題,因為 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

沒有留言:

張貼留言