麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

gcc編譯參數(shù)-fPIC的一些問題

2019-11-10 20:41:42
字體:
供稿:網(wǎng)友
ppc_85xx-gcc -shared -fPIC liberr.c -o liberr.so-fPIC 作用于編譯階段,告訴編譯器產(chǎn)生與位置無關(guān)代碼(Position-Independent Code),  則產(chǎn)生的代碼中,沒有絕對(duì)地址,全部使用相對(duì)地址,故而代碼可以被加載器加載到內(nèi)存的任意  位置,都可以正確的執(zhí)行。這正是共享庫所要求的,共享庫被加載時(shí),在內(nèi)存的位置不是固定的。gcc -shared -fPIC -o 1.so 1.c這里有一個(gè)-fPIC參數(shù)PIC就是position independent codePIC使.so文件的代碼段變?yōu)檎嬲饬x上的共享如果不加-fPIC,則加載.so文件的代碼段時(shí),代碼段引用的數(shù)據(jù)對(duì)象需要重定位, 重定位會(huì)修改代碼段的內(nèi)容,這就造成每個(gè)使用這個(gè).so文件代碼段的進(jìn)程在內(nèi)核里都會(huì)生成這個(gè).so文件代碼段的copy.每個(gè)copy都不一樣,取決于 這個(gè).so文件代碼段和數(shù)據(jù)段內(nèi)存映射的位置.不加fPIC編譯出來的so,是要再加載時(shí)根據(jù)加載到的位置再次重定位的.(因?yàn)樗锩娴拇a并不是位置無關(guān)代碼)如果被多個(gè)應(yīng)用程序共同使用,那么它們必須每個(gè)程序維護(hù)一份so的代碼副本了.(因?yàn)閟o被每個(gè)程序加載的位置都不同,顯然這些重定位后的代碼也不同,當(dāng)然不能共享)我們總是用fPIC來生成so,也從來不用fPIC來生成a.fPIC與動(dòng)態(tài)鏈接可以說基本沒有關(guān)系,libc.so一樣可以不用fPIC編譯,只是這樣的so必須要在加載到用戶程序的地址空間時(shí)重定向所有表目.因此,不用fPIC編譯so并不總是不好.如果你滿足以下4個(gè)需求/條件:1.該庫可能需要經(jīng)常更新2.該庫需要非常高的效率(尤其是有很多全局量的使用時(shí))3.該庫并不很大.4.該庫基本不需要被多個(gè)應(yīng)用程序共享如果用沒有加這個(gè)參數(shù)的編譯后的共享庫,也可以使用的話,可能是兩個(gè)原因:1:gcc默認(rèn)開啟-fPIC選項(xiàng)2:loader使你的代碼位置無關(guān)從GCC來看,shared應(yīng)該是包含fPIC選項(xiàng)的,但似乎不是所以系統(tǒng)都支持,所以最好顯式加上fPIC選項(xiàng)。參見如下`-shared'     PRoduce a shared object which can then be linked with other     objects to form an executable.  Not all systems support this     option.  For predictable results, you must also specify the same     set of options that were used to generate code (`-fpic', `-fPIC',     or model suboptions) when you specify this option.(1)-fPIC 的使用,會(huì)生成 PIC 代碼,.so 要求為 PIC,以達(dá)到動(dòng)態(tài)鏈接的目的,否則,無法實(shí)現(xiàn)動(dòng)態(tài)鏈接。non-PIC 與 PIC 代碼的區(qū)別主要在于 access global data, jump label 的不同。比如一條 access global data 的指令,non-PIC 的形勢是:ld r3, var1PIC 的形式則是:ld r3, var1-offset@GOT,意思是從 GOT 表的 index 為 var1-offset 的地方處指示的地址處裝載一個(gè)值,即var1-offset@GOT處的4個(gè) byte 其實(shí)就是 var1 的地址。這個(gè)地址只有在運(yùn)行的時(shí)候才知道,是由 dynamic-loader(ld-linux.so) 填進(jìn)去的。再比如 jump label 指令non-PIC 的形勢是:jump printf ,意思是調(diào)用 printf。PIC 的形式則是:jump printf-offset@GOT,意思是跳到 GOT 表的 index 為 printf-offset 的地方處指示的地址去執(zhí)行,這個(gè)地址處的代碼擺放在 .plt section,每個(gè)外部函數(shù)對(duì)應(yīng)一段這樣的代碼,其功能是呼叫dynamic-loader(ld-linux.so) 來查找函數(shù)的地址(本例中是 printf),然后將其地址寫到 GOT 表的 index 為 printf-offset 的地方,同時(shí)執(zhí)行這個(gè)函數(shù)。這樣,第2次呼叫 printf 的時(shí)候,就會(huì)直接跳到 printf 的地址,而不必再查找了。GOT 是 data section, 是一個(gè) table, 除專用的幾個(gè) entry,每個(gè) entry 的內(nèi)容可以再執(zhí)行的時(shí)候修改;PLT 是 text section, 是一段一段的 code,執(zhí)行中不需要修改。每個(gè) target 實(shí)現(xiàn) PIC 的機(jī)制不同,但大同小異。比如 MipS 沒有 .plt, 而是叫 .stub,功能和 .plt 一樣。可見,動(dòng)態(tài)鏈接執(zhí)行很復(fù)雜,比靜態(tài)鏈接執(zhí)行時(shí)間長;但是,極大的節(jié)省了 size,PIC 和動(dòng)態(tài)鏈接技術(shù)是計(jì)算機(jī)發(fā)展史上非常重要的一個(gè)里程碑。gcc manul上面有說-fpic        If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC and 32k on the m68k and RS/6000. The 386 has no such limit.)-fPIC       If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k, PowerPC and SPARC. Position-independent code requires special support, and therefore works only on certain machines.關(guān)鍵在于GOT全局偏移量表里面的跳轉(zhuǎn)項(xiàng)大小。intel處理器應(yīng)該是統(tǒng)一4字節(jié),沒有問題。powerpc上由于匯編碼或者機(jī)器碼的特殊要求,所以跳轉(zhuǎn)項(xiàng)分為短、長兩種。-fpic為了節(jié)約內(nèi)存,在GOT里面預(yù)留了“短”長度。而-fPIC則采用了更大的跳轉(zhuǎn)項(xiàng)。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久九九热re6这里有精品 | 一本免费视频 | 欧美三日本三级少妇三级99观看视频 | 日韩.www| 精品久久9999 | 水多视频在线观看 | 爱高潮www亚洲精品 欧美黄色一级片视频 | 国产亚洲精品综合一区91 | 久久久综合视频 | 日本在线看 | 一级黄色片武则天 | 亚洲一区成人 | 最近免费观看高清韩国日本大全 | 免费看日产一区二区三区 | 精品国产一区二区三区四 | 国产精品久久久久久久久久尿 | 日韩欧美电影一区二区三区 | chengrenzaixian| 91精品国产成人 | 一区二区三区国产在线 | 亚洲欧洲日产v特级毛片 | 嫩草影院在线观看网站成人 | 污视频在线免费播放 | 色骚综合 | 国产亚洲综合一区二区 | 一级美女大片 | 日日综合 | av国产片| 国产日韩在线观看一区 | 久久精品欧美一区二区三区不卡 | 亚洲成a人在线 | 国产午夜亚洲精品理论片大丰影院 | 国产一区二区三区网站 | 欧美特黄特色视频 | 黄色男女视频 | 日韩午夜一区二区三区 | 又黄又爽免费无遮挡在线观看 | 成人免费观看49www在线观看 | 全黄裸片武则天一级第4季 偿还电影免费看 | 黄色片视频观看 | 国产精品久久久久久久午夜片 |