linux 內核fpic,linux編譯動態庫 fPIC作用

標簽:

在生成動態庫時,常常習慣性的加上fPIC選項,fPIC有什么作用和意義,加不加有什么區別,這里做下小結:

fPIC的全稱是 Position Independent Code, 用于生成位置無關代碼。什么是位置無關代碼,個人理解是代碼無絕對跳轉,跳轉都為相對跳轉。

1、不加fPIC選項

即使不加fPIC也可以生成.so文件,但是對于源文件有要求,例如

因為不加fPIC編譯的so必須要在加載到用戶程序的地址空間時重定向所有表目,所以在它里面不能引用其它地方的代碼

如下:

#include

int func1(int a)

{

printf("haha a=%d\n", 2);

a++;

return a;

}

使用 gcc? -shared -o libb3.so c.c 編譯將報錯

/usr/bin/ld: /tmp/ccCViivC.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

/tmp/ccCViivC.o: could not read symbols: Bad value

將上述代碼改為:

int func1(int a)

{

//?? ?printf("haha a=%d\n", 2);

a++;

return a;

}

則可以編譯通過。

對于不加 -fPIC生成的動態庫,“ 生成動態庫時假定它被加載在地址 0 處。加載時它會被加載到一個地址(base),這時要進行一次重定位(relocation),把代碼、數據段中所有的地址加上這個 base 的值。這樣代碼運行時就能使用正確的地址了。”

2、加fPIC選項

加上fPIC選項生成的動態庫,顯然是位置無關的

“這樣的代碼本身就能被放到線性地址空間的任意位置,無需修改就能正確執行。通常的方法是獲取指令指針的值,加上一個偏移得到全局變量/函數的地址。”

加fPIC選項的 源文件對于,它引用的函數頭文件編寫有很寬松的尺度。

比如只需要包含個聲明的函數的頭文件,即使沒有相應的C文件來實現,編譯成so庫照樣可以通過。

在內存引用上,加不加fPIC的異同:

加了fPIC實現真正意義上的多個進程共享so文件。

多個進程引用同一個 PIC 動態庫時,可以共用內存。這一個庫在不同進程中的虛擬地址不同,但操作系統顯然會把它們映射到同一塊物理內存上。

對于不加-fPIC的

不加fPIC,則加載so文件時,需要對代碼段引用的數據對象需要重定位,重定位會修改代碼段的內容,這就造成每個使用這個.so文件代碼段的進程在內核里都會生成這個.so文件代碼段的copy.每個copy都不一樣,取決于這個.so文件代碼段和數據段內存映射的位置。

可見,這種方式更消耗內存。

但是不加fPIC編譯的 so文件的優點是加載速度比較快。

標簽:

來源: https://www.cnblogs.com/fengliu-/p/10216878.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278975.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jdk 1結尾和2結尾_“與巢一起工作”的結尾對您意味著什么

jdk 1結尾和2結尾korisbo/Shutterstock科里斯博/ ShutterstockGoogle announced the end of “Works With Nest” at Google I/O 2019. Many companies, from IFTTT to Philips Hue, use Works With Nest to automate your smarthome. Those automations will break soon. Goog…

spring-cloud:利用eureka實現服務提供與調用示例

1.運行環境 開發工具:intellij idea JDK版本:1.8 項目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springCloud-learn-demo/tree/master/spring-cloud-eureka-producer-consumer

linux 桌面顯示視頻播放器,Ubuntu 13.10開啟媒體播放器VLC桌面通知的步驟

VLC是一款多功能的媒體播放器,支持眾多音頻及視頻格式,能夠適用于Ubuntu等系統,而VLC播放器有桌面通知功能,需要手動開啟,下面小編就以Ubuntu 13.10為例,給大家詳細介紹下Ubuntu 13.10開啟VLC桌面通知的步驟…

獨家 | 螞蟻金服TRaaS技術風險防控平臺解密

小螞蟻說: 在金融行業,風險防控能力的重要性不言而喻。而螞蟻金服可實現高達99.999%的異地多活容災,千億級資金秒級實時核對“賬、證、實”等能力也讓業界有目共睹。 今年位于杭州的螞蟻金服ATEC科技大會上,螞蟻金服正式推出技術風…

谷歌表格_如何使用宏自動執行Google表格

谷歌表格Google Sheets lets you automate repetitive tasks with macros, and you can then bind them to keyboard shortcuts to execute them quickly. They work using Google Apps Script to capture your actions for later use. Google表格可以讓您使用宏自動執行重復性…

阿里云彈性高性能計算E-HPC強勢來襲,全新打造一站式云超算

為什么80%的碼農都做不了架構師?>>> 摘要: 如今,高性能計算已在不知不覺中滲透到人類生活的方方面面。從材料科學到石油勘探、金融市場、應急管理、醫學和互聯網等領域,高性能計算無一不大顯身手,幫助快速…

linux導出硬件信息,Linux 上生成硬件信息與配置報告: Sysreport

當需要 Linux 主機詳細完整的描述給另一個人的時候,這個工具非常適合。用 root 用戶之行,但要注意最好不要抓取 currently installed packages 信息,這一步非常慢。(用 -norpm 參數)存儲廠商 EMC 也有個 EMCgrab 工具,工作原理類似…

深度優先搜索(DFS)----------------Tju_Oj_3517The longest athletic track

這個題主要考察對樹的操作,主要思想是DFS或者BFS,其次是找樹的直徑方法(既要運用兩次BFS/DFS),最后作為小白,還練習了vector的操作。 DFS框架偽碼: bool DSF(Node oneTreePoint ){ //傳入的結點和其他有效…

word中圖片超出頁邊距_如何在Word中更改頁邊距

word中圖片超出頁邊距Word documents open with one-inch margins by default. You can adjust the page margins by choosing one of Word’s predefined options, or you can specify the exact height and width of the margins yourself. Here’s how. 默認情況下&#xff…

Android 中文 API (16) —— AnalogClock

一、結構 public class AnalogClock extends View java.lang.Object android.view.View android.widget.AnalogClock 二、類概述 這是一個帶有時針和分針的模擬時鐘控件。 三、受保護的方法 protected void onAttachedToWindow () 視圖(AnalogClock)附在…

linux服務器探針軟件,服務器安裝ServerStatus監控探針教程

前言本文將介紹在服務器上安裝ServerStatus來監控多臺服務器的運行狀態的教程.ServerStatus-Toyo版是一個酷炫高逼格的云探針、云監控、服務器云監控、多服務器探針~,該云監控(云探針)ServerStatus-Toyo項目鏈接本文為Stille原創文章.經實踐,測試,整理發布.如需轉載…

iphone播客怎么上傳_如何在iPhone,iPad或Android上收聽播客

iphone播客怎么上傳Khamosh PathakKhamosh PathakDid someone recently recommend you listen to a podcast? If your response was, “What’s a podcast?” we’ve got the answer, and more! Here’s a crash course on podcasts and how you can listen to them on your …

NOIP2018 退役記

NOIP掛完,OI再見 AFO Day 0 早上的高鐵,1點多到廣州,2點多到酒店,下午就是頹頹頹,然后晚上隨便刷了一下板子,反正PJ也沒啥板子可以刷 就這樣浪費了一天,我到底在干嘛 Day 1 早上心態很好的繼續刷…

Linux決心書/李世超

Linux決心書大家好,我叫李世超,來自河北邯鄲。今年24,感覺之前的生活狀態不是自己想要的,每天渾渾噩噩。我覺得人要對自己定一個目標,我的目標就是月薪10K以上,所以我要努力在老男孩教育學習技術。珍惜這五…

linux下設備或資源忙,linux刪除文件目錄 目錄設備或資源忙怎么辦

linux刪除文件目錄 目錄設備或資源忙怎么辦來源:未知作者:老黑時間:09-09-21【打印】[rootrs swms]# rmdir zpggrmdir: ‘zpgg’: 設備或資源忙相關服務都已經停止掉了,有什么辦法強制刪除嗎?你可以在有windows的硬盤上…

Codeforces 1066 C(思維)

傳送門: 題面: C. Books Queries time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You have got a shelf and want to put some books on it. You are given qq queries of three type…

outlook默認簽名設置_如何將默認簽名添加到Outlook會議請求

outlook默認簽名設置An odd quirk in Outlook is the inability to add a default signature to meeting requests. Here’s a quick and simple way to set up a one-click solution that avoids cutting and pasting every time you create a meeting. Outlook中的一個奇怪問…

技嘉 linux設置u盤啟動項,技嘉主板bios設置u盤啟動教程

對于想要重裝系統的朋友來說,進bios一直是最大的難關,對于技嘉主板來說尤為復雜,下面小編就詳細給大家介紹一下技嘉主板bios設置u盤啟動的方法。方法一:使用u盤啟動快捷鍵直接進入u盤裝系統1、技嘉主板u盤啟動快捷鍵是F12&#xf…

uefi模式下win10安裝雙系統ubuntu18.04LTS

自己折騰了半天,血與淚啊(難得一個可愛的周末 wwww我一定要寫下來 跟這個博客幾乎一模一樣了 https://blog.csdn.net/xrinosvip/article/details/80428133 我的電腦型號:戴爾G3 默認uefi模式,按f2進入的bios界面是新版跟教程上的不…

outlook日歷不顯示_如何在Outlook Online中突出顯示不同的日歷

outlook日歷不顯示If you’ve ever displayed multiple calendars in one view in Outlook Online, you’ll know how useful it is but also how confusing it can get. Use colors and charms to know at a glance which appointment belongs to which calendar. 如果您曾經在…