LibFetion bugs

DDD  2010年03月30日 星期二 17:59 | 2158次浏览 | 0条评论

这里记录了些我在做libfetion小程序时遇到的一些问题,希望大家在遇到类似问题时,有一个小小的借

libfetion bugs

1: linux 64位系统支持

在linux64位版本,libfetion运行一会就崩溃


这个问题困扰了我很久,程序运行一会,铁定会在m_get_sipmsg()函数处崩溃,
那时来回检测了N遍代码,都觉得代码没问题。我和Wenbo Yang也就这个问题研究了好几天。

场景:
m_get_sipmsg()函数返回一个诡异的指针地址(无效),导出程序访问错误地址而崩溃

1.1:
Breakpoint 3, sipmsg_parse_msg (
msg=0x2299fc0 "SIP-C/2.0 401 Unauthoried\r\nF: 67992***\r\nI: 1\r\nQ: 1 R\r\nW: Digest algorithm=\"MD5-sess;SHA1-sess\",nonce=\"1CA6E19B19CCE0D7262EBC1714345FDA\"\r\n\r\n")
at sipmsg.c:85
  正确的 msg 参数地址,是类似于 msg=0x2299fc0 的

1.2
Breakpoint 3, sipmsg_parse_msg (
msg=0x7f6b980016b0 "SIP-C/2.0 200 OK\r\nI: 1\r\nQ: 2 R\r\nX: 600\r\nL: 1291\r\n\r\n<results><client><custom-config version=\"296149662\">H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++99"...) at sipmsg.c:85
  会出问题的是这样的参数地址 msg=0x7f6b980016b0 ,而我们获取的地址是其的低位。


分析:
开始我和Wenbo Yang以为是系统malloc了错误的地址给我们或者我们在哪已经把程序内存给写坏了,导致app引用出错。但如果真是那样的话,基本是很难找到解决方法。
而且问题只出在64位系统上,32位能够正常运行。
最后我实在没辙了,只好找zeng兄来帮我分析下,我把我们的情况详细的给zeng兄说了说,并且将m_get_sipmsg相关的代码和反汇编给zeng兄发过去。

zeng兄的经验果然老到,第二天就告诉我原因了,原来是....


            while(sipmsg = m_get_sipmsg())
 130:   b8 00 00 00 00          mov    $0x0,%eax
 135:   e8 00 00 00 00          callq  13a <thread_funcs+0x13a>
 13a:   48 98                   cltq
 13c:   48 89 45 f8             mov    %rax,-0x8(%rbp)
 140:   48 83 7d f8 00          cmpq   $0x0,-0x8(%rbp)
 145:   0f 85 53 ff ff ff       jne    9e <thread_funcs+0x9e>
                } //end of sipmsg->method, sometimes the method will be null.
                sipmsg_free(sipmsg);
                sipmsg = NULL;
            }


请注意:
 130:   b8 00 00 00 00          mov    $0x0,%eax
 135:   e8 00 00 00 00          callq  13a <thread_funcs+0x13a>
 13a:   48 98                   cltq

cltq[x86-64] convert double word to quad word,
这就是为什么当malloc分配出出高位地址的时候,我们却是获取了底位地址指针的原因。

造成这个原因的问题是:
在当前的.c文件没有包含m_get_sipmsg()函数的申明,所以在编译时,编译器就默认为void*这样的类型的,
并且使用cltq指令来强转返回值。这样在64位系统上,很有可以将64位的指针截短为32位的,导致指针取址失败。


解决:
在那个c文件处加上m_get_sipmsg()函数申明,处理所有该相关的编译警告,最后libfetion在64位机上终于能稳定运行了...

总结:
应该理会每一个编译器给出的warning,尽量需要处理到每一个warning,也许该warning后就隐藏着一个缺陷.

非常感谢zeng兄和Wenbo Yang在这个问题上给予我极大的帮助。





2: 符号隐藏
在debain系统上,很多朋友都遇到了libfetion登录崩溃的问题,最近我在给龙芯移植LibFetiond时,也遇到了这个诡异的问题.

场景:
2.1: 崩溃的代码单独提取处理运行没问题,但只要链接到libfetion库则会崩溃.
2.2: 使用libcurl4-gnutls-dev包,则无论链接到libfetion库与否都没问题,但使用libcurl-openssl-dev包则会有问题。


分析:
从这个现象上看,应该是libfetion库里面的一些符合名和libcurl-openssl-dev有些重叠了,导致本该调用libcurl-openssl-dev里的函数,确调用到
libfetion里的某个函数了


解决:
编译libfetion库时,隐藏不必要的符合导出,增加编译选项: -fvisibility=hidden

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !

暂时没有评论

Zeuux © 2024

京ICP备05028076号