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.mzph.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. 如果您曾经在…