环境: 操作系统:Sun Solaris 10 处理器:AMD 64位
我有一个使用net-snmp库的应用程序。该应用程序是可移植的(代码级)到各种OS和处理器。在net-snmp中,您可以注册一个日志回调(一个函数指针),当要记录某些内容时,它会被调用。
问题在于,当我运行应用程序时,当net-snmp尝试调用我已注册的回调函数时,它会出现故障。注册的回调地址是0xffe30b90,但net-snmp尝试调用0xffffffff ffe30b90。
在调查时,我在同一个应用程序中编写了另一个函数并进行了注册。该函数被正确调用,但它的地址显示为0x52e060(无前导ff)。
我无法弄清楚这里的问题是什么。它似乎与字节对齐或某些指针溢出问题有关。
任何进一步调查的提示都将受到赞赏。谢谢,
-Farooque
答案 0 :(得分:2)
听起来像地址作为带符号的32位int传递,在转换回64位时会进行符号扩展,添加额外的0xFFFF ...位。确保您的代码不假定int
与指针的大小相同,因为Solaris 64位ABI使用“LP64”约定,其中int
是32位,而{ {1}}和指针是64位。