免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6546 | 回复: 8
打印 上一主题 下一主题

【老生常谈】静态函数、全局函数、回调函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-28 21:53 |只看该作者 |倒序浏览
本帖最后由 Mr_Yao 于 2011-11-29 08:48 编辑

问题:
1.静态函数和全局函数编译之后存放在什么位置?
    有的说是在代码区,有人说是在静态变量区。是不是应该存放在代码区内的一个区域里面?
2.静态函数和可重入函数具体是什么关系?
3.静态函数和全局函数的出现有什么目的?是为了更好的实现回调函数么?
或者说,回调函数都是静态或者全局函数么?

欢迎讨论,多谢大家!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2011-11-29 08:16 |只看该作者
俺不知道关心这玩意儿有什么用
只是随便问问,楼主别介意

论坛徽章:
0
3 [报告]
发表于 2011-11-29 08:48 |只看该作者
俺不知道关心这玩意儿有什么用
只是随便问问,楼主别介意
bruceteen 发表于 2011-11-29 08:16



    不會介意的,呵呵。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
4 [报告]
发表于 2011-11-29 15:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2011-11-30 08:51 |只看该作者
樓上兩位廢話不少,正事一個都沒說。

汗......

CU牛人太多了,這種問題以後不能在CU提問了。

被鄙視了.......

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2011-11-30 09:00 |只看该作者
樓上兩位廢話不少,正事一個都沒說。

汗......

CU牛人太多了,這種問題以後不能在CU提問了。

被鄙 ...
Mr_Yao 发表于 2011-11-30 08:51



    你先搞清楚每个“术语”的定义,也许就不会这么问问题了

论坛徽章:
0
7 [报告]
发表于 2011-11-30 10:36 |只看该作者
樓上兩位廢話不少,正事一個都沒說。

汗......

CU牛人太多了,這種問題以後不能在CU提問了。

被鄙 ...
Mr_Yao 发表于 2011-11-30 08:51


你错了,C版中能整明白这些问题的人不超过20%。

我给你个还算靠谱的答案吧,不一定完全正确,但是聊胜于无。 因为对于linker这些玩意,我也只是知道一些而已,并没自己实际做过。

1.静态函数和全局函数编译之后存放在什么位置?
    有的说是在代码区,有人说是在静态变量区。是不是应该存放在代码区内的一个区域里面?


    函数三个可见性范围:

   static函数仅只在本*.c文件内可见,但这种可见性只在编译时有效。
   attribute(visibility(hidden/internal))的函数仅只在本*.so文件内可见,但这种可见性只在动态连接时有效。
   普通的函数就没这些限制,想调就调。

   编译链接完后,这些函数都存在于代码段,text节。程序运行时你只要有办法获得这个函数的地址,照样能调用到它。


2.静态函数和可重入函数具体是什么关系?

   没关系,而且是没有丝毫关系。



3.静态函数和全局函数的出现有什么目的?是为了更好的实现回调函数么?
   或者说,回调函数都是静态或者全局函数么?


  回调函数一般是个函数指针。但是因为文件加载的地址不确定,所以运行之前需要重定位,这个函数指针也需要重定位。

这个函数如果是static修饰的函数,那么连接完毕后,就知道了这函数的相对地址。运行前重定位时只需要加上加载地址即可,对应的重定位项在电脑上是 R_386_RELATIVE。

  这个函数如果是个普通的函数,那么连接完毕后,根本不知道这函数在哪,甚至可能在一个其他*.so中。因此这时的重定位项是R_386_GLOB_DATA,运行前重定位时需要查找可执行文件及依赖的*.so文件的符号表。

论坛徽章:
0
8 [报告]
发表于 2011-12-01 08:37 |只看该作者
本帖最后由 Mr_Yao 于 2011-12-01 08:40 编辑
你错了,C版中能整明白这些问题的人不超过20%。

我给你个还算靠谱的答案吧,不一定完全正确,但是聊 ...
motalelf 发表于 2011-11-30 10:36


多謝!其實這幾個問題都是由“囘調函數”引發的,看了你的第三個問題的解釋,一切都明白了。
再次感謝!

论坛徽章:
0
9 [报告]
发表于 2011-12-01 13:08 |只看该作者
本帖最后由 wells-xu 于 2011-12-01 13:10 编辑

真的勇士敢于直面惨淡的人生

朔料袋, 赞一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP