天天看點

連結選項 -rdynamic與動态符号表

注意,這是 連結選項,而不是編譯選項。 在将c檔案編譯成.o的過程中,使用rdynamic是沒有任何效果的。 隻有将.o連結成elf時,才有效果。

這主要是對可執行程式而言的,而編譯動态庫時,即使沒有rdynamic選項,預設也會将非靜态函數放入動态符号表中(刻意隐藏的函數除外)。

一個驗證方法 顯示可執行程式檔案内的動态符号(注意,僅僅是動态符号): readelf -Ds a.out

預設情況下,可執行程式(非動态庫)檔案内我們定義的非靜态函數,是不放到動态符号表中的,連結時隻有加上-rdynamic才能将所有非靜态函數加到動态符号表中。 但qin_dev中編譯生成的resource_manager,不加rdynamic的情況下,裡面依然會有大量動态符号,why?什麼情況下,即使沒有-rdynamic選項,可執行程式内的很多函數也放到動态符号表中???

一個猜想(待驗證): resourcemanage中為何不加rdynamic也會有大量動态符号,我猜這可能和編譯器對尋址模式的優化有關。helloworld小程式,不加rdynamic就沒有動态符号,這是因為程式太小了,使用短距離的尋址指令完全夠用了。但resourcemanager太大,很多跨檔案的調用,不得不采用動态符号表作為跳闆來進行遠距離尋址。

繼續閱讀