Architectures with strict alignment?

Kostik Belousov kostikbel at gmail.com
Sun Dec 30 05:11:02 PST 2007


On Sat, Dec 29, 2007 at 01:12:04PM +0200, Kostik Belousov wrote:
> On Sat, Dec 29, 2007 at 12:14:11AM -0800, Kip Macy wrote:
> > Isn't it everything except x86?
> > 
> > -Kip
> x86 has the AC bit in the eflags. The AM bit in cr0 is enabled by the
> kernel, and AC could be switched on by LD_PRELOADed shared object.
> 
> Last time I checked, our libc caused unaligned access in the locale
> initialization code.

Out of curiosity, I wrote the following simple LD_PRELOADable shared object.

/* $Id: align.c,v 1.2 2007/12/30 13:06:32 kostik Exp $ */

#define	AC "(1 << 18)"

static void
enable_AC()
{
	__asm volatile("pushfl\n\t"
	    "orl\t$" AC ", (%%esp)\n\t"
	    "popfl\n" : : : "cc");
}

static void
disable_AC(void)
{
	__asm volatile("pushfl\n\t"
	    "andl\t$~" AC ", (%%esp)\n\t"
	    "popfl\n" : : : "cc");
}

static void set_AC(void) __attribute__ ((constructor));
void set_AC(void)
{
	enable_AC();
}

cc -O2 -shared -o align.so align.c 

Doing
	LD_PRELOAD=./align.so /bin/ls
results in the
[1]    12032 bus error (core dumped)  LD_PRELOAD=./align.so /bin/ls

gdb session:
Program terminated with signal 10, Bus error.
#0  0x2816ee8d in __collate_load_tables (encoding=0x281c1280 "ru_RU.KOI8-R")
    at /usr/home/kostik/work/MY/align/src/lib/libc/locale/collate.c:87
    87              (void)strcat(buf, "/");
(gdb) disassemble 0x2816ee8d 0x2816ee8d+10
Dump of assembler code from 0x2816ee8d to 0x2816ee97:
0x2816ee8d <__collate_load_tables+205>: movw   $0x2f,-0x1(%esi,%ecx,1)
0x2816ee94 <__collate_load_tables+212>: mov    0x8(%ebp),%eax

(half-word)0x2f == asciz '/'

I.e., it seems that gcc does not feel too guilty generating unaligned
half-word writes on i386. :(
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20071230/3f38523f/attachment.pgp


More information about the freebsd-hackers mailing list