更新靜態庫的符號索引表

2021-05-23 01:34:19 字數 1259 閱讀 3723

更新靜態庫的符號索引表

本小節的內容相對簡單。前邊提到過,靜態庫檔案需要使用「

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

手冊)。

mysql更新索引庫 Mysql資料庫索引增刪改查

一.索引的作用 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,所以查詢語句的優化顯然是重中之重。在資料量和訪問量不大的情況下,mysql訪問是非常快的,是否加索引對訪問影響不大。但是當資料量和訪問量劇增的...

LINUX靜態庫與動態庫符號衝突問題分析與解決

1.問題重現模型 為了重現問題並去掉無關干擾細節,我們將構建乙個最簡單的可執行模組和依賴模組的關係鏈,程式依賴模型如下 1.1 解釋 1 有乙個名為rtsp的第三方庫提供了公共介面rtsp open,rtsp可以編譯為靜態庫librtsp static.a也可以編譯為動態庫librtsp share...

靜態庫的符號解析和重定義處理策略

一 什麼是靜態庫 將多個普通目標檔案打包成為乙個單獨的檔案,稱為靜態庫。靜態庫是為了解決以下問題而出現的 1 c使用者需要使用大量的c函式庫 把所有的 放在乙個.c檔案中,然後產品 一起編譯鏈結,雖然可以解決這個問題,但是不滿足 2 2 這些c函式需要單獨鏈結程序式,以減少空間浪費 把每個函式作為乙...