一直在想替這些工具取個名字,不然叫做 cc wrapper 和 ld wrapper 好像挺遜的。想來想去,就暫時叫做 cctidy 和 ldtidy 好了,不然乾脆兩個加起來合稱 devtidy,然後去 sf.net 註冊一個專案。
這兩天把 ldtidy 再改寫,加入了更多功能。現在已經可以處理 -rpath-link 和 -rpath。此外,除了會檢查連結順序以外,現在還會檢查相依關係了。
中大型專案裡面,一個函式庫拉幾十個函式庫進來,有的是 .so,有的是 .a,時間一久,經過幾次改版,大概從此之後就再也沒人能找出這些函式庫到底哪些還有在用,哪些應該拿掉。ld 並不會幫你過濾掉用不到的函式庫,objdump 也會照單全收的告訴你所有的函式庫我通通都要(NEEDED),所幸 nm 會幫你列出 symbol,所以 ldtidy 才有機會藉著 symbol 的交互參照,決定哪些函式庫有用到,哪些函式庫沒有。
整個相依關係可以畫成一棵樹,假設我們正在編譯的 A.so 拉了 B.so C.so D.so,其中 B.so 拉了 F.so 而 D.so 拉了 H.so,當我們一股腦兒的拉了 [A-H].so 的時候,ldtidy 會很盡責的列出它們的相依關係,並且在最後提出警告說「A.so 不需要 -lE」「A.so 不需要 -lG」。
不過在實際上的開發案例中,這些函式庫有可能是隨著其他的函式庫的 -config 一起帶進來的,例如 xml2-config --libs 會帶入 -L/usr/local/lib -lxml2 -lz -L/usr/local/lib -liconv -lm,但是可能你的程式從頭到尾都沒有用到和 iconv 有關的那一塊,這樣的話 ldtidy 就會抓到「正在編譯的程式不需要 -liconv」,但是因為它是跟著 `xml2-config --libs` 一起進來的,要把它拿掉有執行上的困難,所以 ldtidy 只會把這個當成 WARNING 而非 ERROR,只會顯示訊息,而不會中斷連結。
如此一來,ldtidy 不但可以幫忙檢查連結順序,也可以幫忙檢查函式庫相依關係囉。

0 意見:
張貼意見