[原]gcc编译器强别名导致的问题

本文详细介绍了在Ubuntu14.04系统下,使用gcc4.8.2编译器遇到的Libnids库在64位架构上无法正确进行TCP报文重组的问题。通过深入研究,发现该问题是由于编译器的强别名机制导致的,并给出了添加-fno-strict-aliasing编译选项的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统:ubuntu14.04

编译器:gcc4.8.2

问题描述:工作需要,使用libnids,所以就下了最新版本的1.24,编译安装后,发现tcp报文重组工作无法完成,具体表现为虽然通过nids_register_tcp函数注册了回调函数,但函数一直不能被执行,通过对libnids执行流程的跟踪,发现在计算checksum的时候出了问题,checksum的值一直不为零,导致libnids认为数据报损坏.

不明所以,但通过思考,觉得问题应该处在编译器上,是不是64位和32为的问题呢?源码中并没有使用long等可能导致问题的数据类型呀.最终确定是由编译器强别名机制导致的问题。

解决方案:编译时加上-fno-strict-aliasing选项

可参考的一些连接:

https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1072650

http://edeca.net/wp/2014/03/libnids-on-64-bit-architecture-machines/

转载于:https://www.cnblogs.com/caoyingjie/p/4179178.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值