摘要: 这段时间遇到了两个字节对其相关的bug,折腾了我许久。原因主要有两点:1.程序崩在最不可能的地方,调试的时候即便调到汇编级的,指针前一个指令值还是正确的,ret后却错了,且这段代码从来不被认为会出错。2.在一个庞大的工程中,头文件引用错综复杂,很难寻找到是哪个地方设置了不正确的字节对齐方式。 引起字节对齐错误的原因却很简单,比如一个结构体定义在一个头文件中,被模块A按转4节齐对齐编译,又被模块B按照1字节对齐编译,该结构体指针在A,B模块之间传递,引用成员时因为成员地址不同,导致程序崩溃。例如:#pragma pack(4)struct _Test{ ... 阅读全文
posted @ 2012-05-19 19:16 persistentsnail 阅读(2097) 评论(0) 推荐(0) 编辑
摘要: 背景前不久在调试一个与导出符号相关的bug,问题大概如此:模块A.so在堆上构造了一个对象即CTest*one=newCTest;,CTest在A.so定义,后来使用one->AMemFunc();,即调用一个成员函数时崩溃。原来在另一个模块B.so(比A.so先加载)中,也有一个同名的CTest定义,但是却没有一个叫AMemFunc的成员函数,因此崩溃。那为什么A.so的CTest会被解析到B.so呢?全局符号介入这种一个共享对象里面的全局符号被另一个共享对象的同名全局符号覆盖的现象又被称为共享对象全局符号介入(GlobalSymbolInterpose)。对于全局符号介入这个问题,l 阅读全文
posted @ 2012-05-19 11:21 persistentsnail 阅读(2794) 评论(0) 推荐(0) 编辑