OoO En cette soirée bien amorcée du mardi 11 mai 2010, vers 22:41, je disais: >> lldpd, a program of my own, available on https://trac.luffy.cx/lldpd/ ;, > [...] > I have another alignment problem on ARM (still not related to > Debian). Since I did get valuable help here last year, I try again. :) [...] > The user reporting the error is using some old uclibc which does not > define getifaddrs() nor struct ifaddrs. Therefore, I have reimplemented > getifaddrs() and I declare struct ifaddrs as it appears in > /usr/include/ifaddrs.h (using struct sockaddr for ifa_addr). I see that > there is some internal datatype called struct sockaddr_storage that > tries to deal with alignment issues. Is it the key to my problem? Using a porter box, I have discovered that this also happens in sid for both ARM and mips with a standard libc. I have fixed my problems with this patch: http://cgit.luffy.cx/lldpd/commit/?id=06db3608149133dd5efc38e68d47c06840f9c86b While the memcpy stuff is not so ugly, I have used offsetof() to avoid an additional memcpy just to replace a cast. Luca, thanks for your answer. Unfortunately, using __attribute__((aligned(2))) would align the pointer to struct sockaddr. I have no way to force alignment of the struct itself. For example, consider the following code : unsigned short int a; /* Just here to misalign the following struct */ struct sockaddr mysa; /* Suppose that myaddr is aligned on a 1-byte boundary but misaligned on a 2-byte boundary */ struct ifaddrs myifaddr; struct sockaddr_ll *mysall; myifaddr.ifa_addr = &mysa; mysall = (struct sockaddr_ll *)(myifaddr.ifa_addr); /* Equivalent to: */ mysall = (struct sockaddr_ll *)&mysa; I have tested anyway and the warning remain. While I have fixed my warnings, I am still a bit astonished that such a common code as : sa = (struct sockaddr_in *)ifa->ifa_addr; if (... sa->sin_addr ...) ... can lead to a misaligned access on ARM. Maybe there is something somewhere that ensure that struct sockaddr and struct sockaddr_ll are always aligned correctly on a 4-byte boundary? -- /* Fuck me gently with a chainsaw... */ 2.0.38 /usr/src/linux/arch/sparc/kernel/ptrace.c
Attachment:
pgpHksj4dMToV.pgp
Description: PGP signature