编译参数
2015-10-23 10:56
393 查看
-fPIC
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
PIC使.so文件的代码段变为真正意义上的共享
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.
不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
因此,不用fPIC编译so并不总是不好.
如果你满足以下4个需求/条件:
1.该库可能需要经常更新
2.该库需要非常高的效率(尤其是有很多全局量的使用时)
3.该库并不很大.
4.该库基本不需要被多个应用程序共享
+++++++++++++++++++++++++++++++++
-Wall
-Wall 打印出gcc提供的警告信息
-v 列出所有编译步骤
+++++++++++++++++++++++++++++++++
另外,一个小问题:
g++ -Wall -I. -L. -lsubclass -o main caller.cpp
提示我 undefined function
然后我各种纠结,最后更改了一下源码的顺序就好了:
g++ caller.cpp -Wall -I. -L. -lsubclass -o main
请问这是为什么?
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
PIC使.so文件的代码段变为真正意义上的共享
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.
不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
因此,不用fPIC编译so并不总是不好.
如果你满足以下4个需求/条件:
1.该库可能需要经常更新
2.该库需要非常高的效率(尤其是有很多全局量的使用时)
3.该库并不很大.
4.该库基本不需要被多个应用程序共享
+++++++++++++++++++++++++++++++++
-Wall
-Wall 打印出gcc提供的警告信息
-v 列出所有编译步骤
+++++++++++++++++++++++++++++++++
另外,一个小问题:
g++ -Wall -I. -L. -lsubclass -o main caller.cpp
提示我 undefined function
然后我各种纠结,最后更改了一下源码的顺序就好了:
g++ caller.cpp -Wall -I. -L. -lsubclass -o main
请问这是为什么?
相关文章推荐
- 在PHP中对查询出得数据库数据进行json编码
- c语言中的函数的定义以及相关的调用、嵌套、递归以及和数组的关系
- Linkify介绍(在TextView类中创建超链接
- Android 微信支付 判断用户手机是否安装微信客户端
- JS escape、encodeURI 、encodeURIComponent 编码与解码
- 关于全排列的总结
- Python中logging模块的使用
- Android四大图片缓存框架之-Fresco(一)
- HDU 4455(dp)
- C++项目编译后生成哪些文件?
- HTML学习 <2>
- 伸展树-入门
- intellij+maven 非插件形式使用tomcat
- 无法读取项目文件 .csproj
- maven联通网络下中央仓库不能访问的解决办法
- 使用u盘装系统-ultralos的使用
- TableViewCell自适应高度
- Neutron命令测试4
- sip比较好的博客
- vijosP1195“非常男女”计划