博客專欄

        EEPW首頁 > 博客 > ranlib的作用

        ranlib的作用

        發布人:電子禪石 時間:2021-05-27 來源:工程師 發布文章

        更新靜態庫的符號索引表 

        本小節的內容相對簡單。前邊提到過,靜態庫文件需要使用“ar”來創建和維護。當給靜態庫增建一個成員時(加入一個.o文件到靜態庫中),“ar”可直接 將需要增加的.o文件簡單的追加到靜態庫的末尾。之后當我們使用這個庫進行連接生成可執行文件時,鏈接程序“ld”卻提示錯誤,這可能是:主程序使用了之 前加入到庫中的.o文件中定義的一個函數或者全局變量,但連接程序無法找到這個函數或者變量。 

        這個問題的原因是:之前我們將編譯完成的.o文件直接加入到了庫的末尾,卻并沒有更新庫的有效符號表。連接程序進行連接時,在靜態庫的符號索引表中無法定 位剛才加入的.o文件中定義的函數或者變量。這就需要在完成庫成員追加以后讓加入的所有.o文件中定義的函數(變量)有效,完成這個工作需要使用另外一個 工具“ranlib”來對靜態庫的符號索引表進行更新。 

        我們所使用到的靜態庫(文檔文件)中,存在這樣一個特殊的成員,它的名字是“__.SYMDEF”。它包含了靜態庫中所有成員所定義的有效符號(函數名、 變量名)。因此,當為庫增加了一個成員時,相應的就需要更新成員“__.SYMDEF”,否則所增加的成員中定義的所有的符號將無法被連接程序定位。完成 更新的命令是: 
        ranlib ARCHIVEFILE 
        通常在Makefile中我們可以這樣來實現: 
        libfoo.a: libfoo.a(x.o) libfoo.a(y.o) ... 
        ranlib libfoo.a 

        它所實現的是在更新靜態庫成員“x.o”和“y.o”之后,對靜態庫的成員“__.SYMDEF”進行更新(更新庫的符號索引表)。 

        如果我們使用GNU ar工具來維護、管理靜態庫,我們就不需要考慮這一步。GNU ar本身已經提供了在更新庫的同時更新符號索引表的功能(這是默認行為,也可以通過命令行選項控制ar的具體行為??蓞⒖?GNU ar工具的man手冊)。

         

        GNU工具中ar是用來制作庫文件.a的,但同時還提供了一個ranlib,從手冊上看ranlib相當于ar -s,為什么這樣呢?

        這是由于最早在Unix系統上ar程序是單純用來打包多個.o到.a(類似于tar做的事情),而不處理.o里的符號表。Linker程序則需 要.a文件提供一個完整的符號表,所以當時就寫了單獨的ranlib程序用來產生linker所需要的符號信息。也就是說,產生一個對linker合 格的的.a文件需要做ar和ranlib兩步 。

        很快,Unix廠商就發現ranlib做得事情完全可以合并到ar里面去,于是ar程序的升級版本就包括了ranlib的功能,但早期的很多項目的Makefile都已經是按照兩步式的方法生成.a,所以為了保證這些早期文件的兼容性,ranlib被保留下來了。

        如今,GNU/Linux系統上,ranlib依然存在,當然大部分項目已經不使用它了,因為ar -s就做了ranlib的工作。
        歷史通常是進步和妥協的混合!


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: ranlib

        技術專區

        關閉
        主站蜘蛛池模板: 湘潭县| 延长县| 玉屏| 利津县| 靖西县| 博野县| 正阳县| 高尔夫| 安徽省| 麻江县| 通州区| 兰溪市| 新昌县| 九江市| 景德镇市| 合山市| 阆中市| 江北区| 师宗县| 米脂县| 广元市| 襄樊市| 长子县| 玉溪市| 临朐县| 南昌市| 蓝田县| 蕲春县| 贡山| 巨野县| 碌曲县| 新建县| 廊坊市| 武宣县| 邮箱| 大安市| 田林县| 荃湾区| 绍兴县| 巩义市| 东兴市|