gcc裡的引數 fPIC的一些問題

2021-05-23 00:10:11 字數 2413 閱讀 7758

請問gcc裡的引數-fpic的一些問題

加上-fpic引數後,編譯後的檔案和沒有加這個引數的檔案,有什麼區別呢,在**裡面做了什麼修改能增強它的可重定位性,或者說位置無關性呢?

而且,用沒有加這個引數的編譯後的共享庫,也可以使用,它和加了引數後的使用起來又有什麼區別呢

謝謝

印隨

可能是兩個原因:

1:gcc預設開啟-fpic選項

2:loader使你的**位置無關

yjm0573

一般都用於編譯共享庫

baohuaihuai

我的理解.

不加fpic編譯出來的so,是要再載入時根據載入到的位置再次重定位的.(因為它裡面的**並不是位置無關**)

如果被多個應用程式共同使用,那麼它們必須每個程式維護乙份so的**副本了.(因為so被每個程式載入的位置都不同,顯然這些重定位後的**也不同,當然不能共享)

這樣就失去了共享庫的好處,實際上和靜態庫的區別並不大,在執行時占用的記憶體是類似的,僅僅是二進位制**佔的硬碟空間小一些.而且在載入時才重定位的開銷也很大(這一點使得這種做法更加沒有意義).

[[i] 本帖最後由 baohuaihuai 於 2007-12-28 11:54 編輯 [/i]]

baohuaihuai

事實上有比不用fpic編譯so更加bh的...........那就是..用fpic選項製作靜態庫.

accelerator

[quote]原帖由 [i]baohuaihuai[/i] 於 2007-12-28 11:52 發表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7779936&ptid=1035042][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]

我的理解.

不加fpic編譯出來的so,是要再載入時根據載入到的位置再次重定位的.(因為它裡面的**並不是位置無關**)

如果被多個應用程式共同使用,那麼它們必須每個程式維護乙份so的**副本了.(因為so被每個程 ... [/quote]

閣下忽略了動態連線庫的另外乙個非常重要的作用, 動態連線, 這樣程式可以支援二進位制檔案介面, 比如連線libc時一般都使用.so而不是.a, 你總不想在libc更新後重新鏈結你的程式吧? 實際上這種功能比所謂的share更重要, 應用也更廣泛.

baohuaihuai

[quote]原帖由 [i]accelerator[/i] 於 2007-12-28 12:32 發表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7780263&ptid=1035042][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]

閣下忽略了動態連線庫的另外乙個非常重要的作用, 動態連線, 這樣程式可以支援二進位制檔案介面, 比如連線libc時一般都使用.so而不是.a, 你總不想在libc更新後重新鏈結你的程式吧? 實際上這種功能比所謂的shar ... [/quote]

閣下好象誤會了我的意思,我只是針對fpic在做說明.fpic與非fpic的區別,與.so和.a的區別是兩回事.雖然我們總是用fpic來生成so,也從來不用fpic來生成a.

baohuaihuai

因此,不用fpic編譯so並不總是不好.

如果你滿足以下4個需求/條件:

1.該庫可能需要經常更新

2.該庫需要非常高的效率(尤其是有很多全域性量的使用時)

3.該庫並不很大.

4.該庫基本不需要被多個應用程式共享

我認為你的so就完全可以不用fpic編譯.

zx_wing

[quote]原帖由 [i]yongzhi[/i] 於 2007-12-27 16:36 發表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7775986&ptid=1035042][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]

加上-fpic引數後,編譯後的檔案和沒有加這個引數的檔案,有什麼區別呢,在**裡面做了什麼修改能增強它的可重定位性,或者說位置無關性呢?

而且,用沒有加這個引數的編譯後的共享庫,也可以使用,它和加了參 ... [/quote]

從gcc來看,shared應該是包含fpic選項的,但似乎不是所以系統都支援,所以最好顯式加上fpic選項。參見如下

gcc 的一些用法

gcc編譯多個原始檔 一.常用編譯命令選項 假設源程式檔名為test.c。3.選項 e 用法 gcc e test.c o test.i 作用 將test.c預處理輸出test.i檔案。4.選項 s 用法 gcc s test.i 作用 將預處理輸出檔案test.i彙編成test.s檔案。5.選項 ...

Parallels Desktop 的一些問題

並且無法進行su命令,提示 authentication failure。這個問題產生的原因是由於系統預設是沒有啟用root使用者的,需要我們手工進行操作,在命令列介面下,或者在終端中輸入如下命令 sudo passwd password 你當前的密碼 enter new unix password...

關於gcc的一些學習

參考部落格 c原始檔到可執行檔案共經歷了4個過程。包括預處理 編譯 彙編 鏈結。為了方便好記,可以採用記錄單條編譯命令的方式,這樣可以把命令也一起記下來。比如 esco gcc e hello.c hello.i 編譯器將hello.c預處理結果輸出 hello.i 檔案。這是我本地的hello.c...