gcc里的参数-fPIC的一些问题

news/2024/7/5 6:31:40

请问gcc里的参数-fPIC的一些问题

加上-fPIC参数后,编译后的文件和没有加这个参数的文件,有什么区别呢,在代码里面做了什么修改能增强它的可重定位性,或者说位置无关性呢?
而且,用没有加这个参数的编译后的共享库,也可以使用,它和加了参数后的使用起来又有什么区别呢
谢谢

印随
可能是两个原因:
1:gcc默认开启-fPIC选项
2:loader使你的代码位置无关

yjm0573
一般都用于编译共享库

baohuaihuai
我的理解.
不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
如果被多个应用程序共同使用,那么它们必须每个程序维护一份so的代码副本了.(因为so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)
这样就失去了共享库的好处,实际上和静态库的区别并不大,在运行时占用的内存是类似的,仅仅是二进制代码占的硬盘空间小一些.而且在加载时才重定位的开销也很大(这一点使得这种做法更加没有意义).

[[i] 本帖最后由 baohuaihuai 于 2007-12-28 11:54 编辑 [/i]]

baohuaihuai
事实上有比不用fPIC编译so更加bh的...........那就是..用fPIC选项制作静态库.

accelerator
[quote]原帖由 [i]baohuaihuai[/i] 于 2007-12-28 11:52 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7779936&ptid=1035042][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
我的理解.
不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)
如果被多个应用程序共同使用,那么它们必须每个程序维护一份so的代码副本了.(因为so被每个程 ... [/quote]

阁下忽略了动态连接库的另外一个非常重要的作用, 动态连接, 这样程序可以支持二进制文件接口, 比如连接libc时一般都使用.so而不是.a, 你总不想在libc更新后重新链接你的程序吧? 实际上这种功能比所谓的share更重要, 应用也更广泛.

baohuaihuai
[quote]原帖由 [i]accelerator[/i] 于 2007-12-28 12:32 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7780263&ptid=1035042][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]


阁下忽略了动态连接库的另外一个非常重要的作用, 动态连接, 这样程序可以支持二进制文件接口, 比如连接libc时一般都使用.so而不是.a, 你总不想在libc更新后重新链接你的程序吧? 实际上这种功能比所谓的shar ... [/quote]

阁下好象误会了我的意思,我只是针对fPIC在做说明.fPIC与非fPIC的区别,与.so和.a的区别是两回事.虽然我们总是用fPIC来生成so,也从来不用fPIC来生成a.
fPIC与动态链接可以说基本没有关系,libc.so一样可以不用fPIC编译,只是这样的so必须要在加载到用户程序的地址空间时重定向所有表目.

baohuaihuai
因此,不用fPIC编译so并不总是不好.
如果你满足以下4个需求/条件:
1.该库可能需要经常更新
2.该库需要非常高的效率(尤其是有很多全局量的使用时)
3.该库并不很大.
4.该库基本不需要被多个应用程序共享

我认为你的so就完全可以不用fPIC编译.

zx_wing
[quote]原帖由 [i]yongzhi[/i] 于 2007-12-27 16:36 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7775986&ptid=1035042][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
加上-fPIC参数后,编译后的文件和没有加这个参数的文件,有什么区别呢,在代码里面做了什么修改能增强它的可重定位性,或者说位置无关性呢?
而且,用没有加这个参数的编译后的共享库,也可以使用,它和加了参 ... [/quote]
从GCC来看,shared应该是包含fPIC选项的,但似乎不是所以系统都支持,所以最好显式加上fPIC选项。参见如下


http://www.niftyadmin.cn/n/4747440.html

相关文章

传闻微软将停止发展Silverlight

原文链接 ZDNet专栏作者Mary-Jo Foley今天撰文表示,作为Adobe Flash的最大对手微软发展数年的Silverlight浏览器插件将在版本5后停止更新, 不过目前还不清楚微软会对这款产品提供多长的后续支持时间,微软没有对此消息做出回应。   停止Sil…

UML建模---活动图

活动图是UML用于对系统的动态行为建模的另一种常用工具, 描述活动的顺序,展现从一个活动到另一个活动的控制流。活动图在本质上是一种流程图。活动图着重表现从一个活动到另一个活动的控制流,是内部处理驱动的流程。 下面详细一下介绍活动图&…

minigui 处理细节

minigui 控件处理细节 (2023-05-00 00:00:00) 转载标签: 杂谈 分类:minigui 来源:(http://blog.sina.com.cn/s/blog_684a74300100j2fx.html) - minigui 控件处理细节_玻璃心_新浪博客 1,控件的隐藏 ShowWindow( GetDlgItem( hwnd, IDC_PROM…

老子的软件之道 - 道篇 26 应用软件的根基

摘要:老子哲学 道德经 软件哲学、软件之道 参阅:序消灭人狼软件的十大命题编程规则 圣人曰:重为轻根,静为躁君。是以君子终日行不离轻重。虽有荣观燕处超然。奈何万乘之主而以身轻天下。轻则失根,躁则失君。 本文先哲…

MiniGUI编程-细节

MiniGUI编程--列表框 分类: minigui2009-11-04 20:40列表框LBS(ListBoxStyle)以CTRL_LIST/"list"为类名调用CreateWindow多选风格:LBS_MULTIPLESEL高级风各:LBS_USEICONLBS_CHECKBOXLBS_AUTOCHECK加上边框WS_BORDER加垂直滚动条WS_VSCROLL加水…

你的成功在于你每天养成的习惯

收藏 要成功,就马上准备有所付出吧!这就是每天你应该养成的习惯。 1、不说“不可能”; 2、凡事第一反应: 找方法,不找借口; 3、遇到挫折对自己说声:太好了,机会来了! 4、…

阿甘正传 收藏

今天早上看了阿甘正传觉得,我们还是得抽点时间看看电影,特别是像《阿甘正传》这种有韵味的电影,里面的人生哲学真的很值得人们去深思。我已经好久没写博客了,很多朋友觉得我的日志给了他们很大的启发,其实我的很多思想…

老子的软件之道 - 道篇 27 团队管理的真谛

摘要:老子哲学 道德经 软件哲学、软件之道 参阅:序消灭人狼软件的十大命题编程规则 圣人曰:善行无辙迹。善言无瑕谪。善数不用筹策。善闭无关楗而不可开。善结无绳约而不可解。是以圣人常善救人,故无弃人。常善救物,故…