2个程序(一个用glue,一个直接连接xpcom)用了NS_GetServiceManager全部死掉,SIGSEGV的原因

来源:互联网 发布:linux 移动文件夹指令 编辑:程序博客网 时间:2024/05/15 23:45
个程序(一个用glue,一个直接连接xpcom)用了NS_GetServiceManager全部死掉,SIGSEGV

gluetest 错误的原因是因为gluetest和libxpcomglue.a编译选项不一致,使得gluetest和libxpcomglue.a中的 getter_AddRefs<nsIServiceManager>(nsCOMPtr<nsIServiceManager>&)

代码不一致(调用方式也不一致),然后执行的时候libxpcomglue.a用的函数用的是gluetest生成的函数---用objdump找到原因的

---解决方法,用和libxpcomglue.a一样的编译选项编译就可以了,原因是如果没有有-DDEBUG -D_DEBUG,

生成的调用方式不一样(我的机器是amd64,gcc 3.4.6-3),不知道是真正的原因,是否有人知道,望告知


xpcomtest死掉的原因是类似,在so文件中的函数调用了xpcomtest中的getter_AddRefs同名的函数(???)

另外如果不要NS_GetServiceManager,好像是好的,因为这个是没有生成getter_AddRefs,这个是一个模板参数


--原因:
    因为exe文件和so文件里面多有一个getter_AddRefs,因为他们是WEAK(elf),所有就可以同时存在,然后so文件调用的时候调用了exe中的函数,
 可能是在x86_64中引起的,因为gcc的bug(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20297),使得编译mozilla的时候加了去掉了这个option
---解决:
    1.用同一个编译选项,程序可以执行,但是方法不好
    2. 在exe中不输出symbol,要在gcc中找这个option,(还没有找到)
        在编译mozilla的时候加ac_have_visibility_buildin_bug=yes,不要加ac_have_visibility_pragram=no
       并且在编译自己的程序的时候加-fvisibility=hidden