gcc报错 can not be used when making a shared object; recompile with -fPIC
- 问题1:gcc报错 can not be used when making a shared object; recompile with -fPIC
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.
不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
如果被多个应用程序共同使用,那么它们必须每个程序维护一份so的代码副本了.(因为so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)
我们总是用fPIC来生成so,也从来不用fPIC来生成a.
fPIC与动态链接可以说基本没有关系,libc.so一样可以不用fPIC编译,只是这样的so必须要在加载到用户程序的地址空间时重定向所有表目.
因此,不用fPIC编译so并不总是不好.
如果你满足以下4个需求/条件:
1.该库可能需要经常更新
2.该库需要非常高的效率(尤其是有很多全局量的使用时)
3.该库并不很大.
4.该库基本不需要被多个应用程序共享
如果用没有加这个参数的编译后的共享库,也可以使用的话,可能是两个原因:
1:gcc默认开启-fPIC选项
2:loader使你的代码位置无关
修改cmake
set(extra_cmake_args)list(APPEND extra_cmake_args "-DCMAKE_CXX_FLAGS=-std=c++14 -w -fPIC")list(APPEND extra_cmake_args "-DCMAKE_C_FLAGS=-std=-w -fPIC")
或者
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
- 问题2: .bss .data can not be used when making a PIE object
所以解决方案为
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -no-pie")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -no-pie")
- 扩展:
ELF
Exucutable and Linkable Format,译为“可执行和可链接的格式”。
它是关于可执行文件、对象代码、共享库和内核导出的一种公共标准文件的格式定义,广泛应用于类unix系统。
每个ELF文件由三个部分组成:Program header table、Sectoin header table、Data referred to above。
PIC
Position-Independent Code,译为“位置无关代码”。
在计算机系统中,PIC是可以在主存中不同位置执行的目标代码。
PIC经常被用在共享库中,这样就能将相同的库代码为每个程序映射到一个位置,不用担心覆盖掉其他程序或共享库。
PIE
Position-Independent Executable,译为“位置无关可执行程序”。
它是完全由位置无关代码所组成的可执行二进制文件,有时可称为PIC Executable。
它有一个显著的优点,那就是当程序加载时,所有PIE二进制文件以及它所有的依赖都会加载到虚拟内存空间中的随机位置(随机地址),可以有效提高他人通过绝对地址实施"return-to-libc"安全攻击的难度。
GOT
Global Offset Table。全局偏移量表。
它是数据字段的地址存储表。它被可执行程序用于查看全局变量的运行时地址,这些变量的地址在编译阶段是未知的。
在进程引导阶段,动态链接器会更新GOT。
PLT
Procedure Linkage Table。过程链接表
它将位置无关的的函数调用转换为绝对地址。形象的比喻,PLT像蹦床一样,将对共享函数的调用弹向正确的方向。
Lasy Loading/Lasy Binding
延迟加载。
在位置无关代码PIC中一般不能包含动态链接库中符号的绝对地址。当运行某个调用动态库函数符号的用户态程序时,用户态程序在编译链接阶段并不知晓该符号的具体位置,只有等到运行阶段,动态加载器将所需要的共享库加载到内存后,才最终确定符号的地址。而在编译阶段所有与位置无关的函数调用都将被保存到ELF文件的过程链接表PLT(Procedure Linkage Table)中。
gcc报错 can not be used when making a shared object; recompile with -fPIC相关推荐
- import dlib,报错:ImportError: libcublas.so.10.0: cannot open shared object file: No such file or direc
import dlib,报错:ImportError: libcublas.so.10.0: cannot open shared object file: No such file or direc ...
- linux c gcc编译报错 can not be used when making a shared object; recompile with -fPIC
目录 错误现象 错误原因 解决方法 PIC 简介 错误现象 使用 google protobuf 时,出现错误 /usr/bin/ld: /usr/local/lib/libprotobuf.a(me ...
- 解决gcc报错:error: implicit declaration of function ‘inet_addr’ [-Werror=implicit-function-declaration]
此文首发于我的个人博客:解决gcc报错 error implicit declaration of function 'inet_addr' [-Werror=implicit-function-de ...
- centos7安装gcc报错
yum install -y gcc报错的解决方法如下 错误:软件包:glibc-2.17-196.el7.i686 (yum.repo) 需要:glibc-common = 2.17-196.el7 ...
- Linux中yum执行yum -y install gcc 报错 解决方案
Linux中yum执行yum -y install gcc 报错 解决方案 本人实际遇到的问题,已亲测正式环境,为防止下次在遇到,在这里做个记录,遇到此问题的小伙伴可以参考此文章. 文章摘自其它网友博 ...
- 安装sikuli报错:jnius/jnius_conversion.pxi:54:31: Casting temporary Python object to non-numeric non-Pyth
问题:ubuntu 安装sikuli报错:jnius/jnius_conversion.pxi:54:31: Casting temporary Python object to non-numeri ...
- Django报错 ValueError: The view didn‘t return an HttpResponse object. It returned None instead.
Django报错 ValueError: The view *** didn't return an HttpResponse object. It returned None instead. __ ...
- 解决statsmodels报错ValueError: Pandas data cast to numpy dtype of object.
完整报错是:ValueError: Pandas data cast to numpy dtype of object. Check input data with np.asarray(data). ...
- SparkSQL报错:UnresolvedException: Invalid call to dataType on unresolved object, tree: 'bb
1.美图 2.背景 /*** 测试点:测试系统函数,能否支持* 测试结果:报错* Caused by: org.apache.spark.sql.catalyst.analysis.Unresolve ...
最新文章
- 如何打印一个Struct来调试
- MATLAB机器学习系列-11:粒子群优化原理及其matlab实现
- pyinstaller打包exe在其他机器无法运行_详解pyinstaller selenium python3 chrome打包问题!解决率100%...
- Spark资源分配异常闪Bug
- poj 2371 Questions and answers
- 论文浅尝 | 基于深度序列模型的知识图谱补全
- termux apache php,要啥自行车之Termux:将我们的(Android)安卓手机打造成全能的服务器...
- 一篇文章搞懂前端学习方法与构建知识体系,怎么做自己的职业规划
- 现代语音信号处理之语音特征参数估计
- 菜刀之中国蚁剑-安装使用及下载地址
- 关于jQuery通知插件toastr的使用
- 德阳计算机办公培训,德阳2017计算机办公软件培训
- 波长间隔与频率间隔换算
- ae合成设置快捷键_ae技巧,使用ae实用小技巧
- html+css实现星系图
- Ubuntu20.04 Server+Xubuntu-desktop英文环境下安装百度五笔
- C语言的良好编程习惯
- 51单片机外中断流水灯
- 微信小游戏从零开始申请软著到上线
- 科大讯飞为AI生态砸了10.24亿,胡郁本人做了以下回应