【发布时间】:2017-08-28 07:10:00
【问题描述】:
我检查了 git 日志为 https://patchwork.sourceware.org/patch/12453/。此修改似乎解决了特定平台上的问题。 但我不明白为什么要在 struct sockaddr_storage 中交换 __ss_align 和 __ss_padding。 我现在正在开发的 Qualcomm 平台有很多类型转换,如下所示。
struct sockaddr_storage prefix_addr
(struct sockaddr_in6 *)&(prefix_addr)->sin6_addr.s6_addr
在我们的 Cortex A7 平台上,结构对齐如下:
glibc2.23 之前:
struct sockaddr_in6
{
sin6_family; //0th byte
sin6_port; //2nd byte
sin6_flowinfo; //4th byte
sin6_addr; //8th byte
};
struct sockaddr_storage
{
ss_family; //0th byte
__ss_align; //4th byte
__ss_padding; //8th byte
};
glibc2.23之后:
struct sockaddr_storage
{
ss_family; //0th byte
__ss_padding; //2nd byte
__ss_align; //124th byte
};
glibc 改变了 struct sockaddr_storage,但 struct sockaddr_in6 并没有改变,所以这个修改会在我们的平台上造成很多对齐问题,导致获取 IPV6 地址错误。
【问题讨论】: