免费注册 查看新帖 |

Chinaunix

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

[C++] AIX/LINUX下共享库中全局变量构造顺序差异问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-27 17:10 |只看该作者 |倒序浏览
大致情况是这样,一个程序包含一个可执行的app和两个so库,依赖关系是app依赖liba.so,liba依赖libb.so(app-->liba -->libb).
liba中有一个类A的全局变量g_a, 构造函数中输出一条消息“class A init”,
同样,libb中有一个类B的全局变量g_b,构造函数中输出一条“class B init”

在AIX下编译后执行输出:
class A init
class B init

而在LINUX下执行收输出
class B init
class A init

按理说,被依赖的库应该优先初始化,LINUX的结果应该是符合预期的。
但是AIX下顺序颠倒了,导致LIBA初始化过程中依赖LIBB的部分失败。

本人对AIX不太熟悉,希望有大师给指点一下,
如何能够使AIX在初始化共享库依赖时的行为,和LINUX一致。

论坛徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉鸡
日期:2013-12-04 19:56:39
2 [报告]
发表于 2016-07-28 09:46 |只看该作者
不太了解,估计跟编译器有关
aix下是使用gcc toochains么?
如果是,那么只有改成显式初始化,这个才能由你控制

论坛徽章:
0
3 [报告]
发表于 2016-07-28 10:09 |只看该作者
回复 2# 流氓无产者

xlc, 就是因为要用xlc,所有掉坑里不知道怎么爬出来。。。

   

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
4 [报告]
发表于 2016-07-29 09:42 |只看该作者
向IBM报Bug噬~~~


然而有一条规则是: SO初始化中不能Load另一个SO。所以,最好你改改自已的代码。

论坛徽章:
0
5 [报告]
发表于 2016-08-01 11:32 |只看该作者
回复 4# folklore


    哦,难道一个SO不能依赖另一个SO? 那一个SO要调用另一个SO的的函数怎么办?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
6 [报告]
发表于 2016-08-02 08:08 |只看该作者
一个SO可以依赖另一个SO,请见上面帖子中的
"初始化中"

论坛徽章:
0
7 [报告]
发表于 2016-08-04 10:16 |只看该作者
回复 6# folklore


    没有在初始化时做dlopen,依赖关系在编译链接时就定了。库加载应该在进程初始化是自动干的。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
8 [报告]
发表于 2016-08-21 21:37 |只看该作者
如果一个so有全局类实例,那这个全局类的初始化(Constructor)中不能依赖另一个SO。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
9 [报告]
发表于 2016-08-23 08:28 |只看该作者
我猜一个办法, 也许可行,  就是全局变量中定义为   std::shard_ptr<T>  sp_t;
在main中,再初始化,  sp_t=std::make_shared_ptr<T>(.....),
这样就把初始化放到最后的环节来实现了, 是否就没有这个问题了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP