http://lists.debian.org/debian-arm/2007/05/msg00039.html From: Lennert Buytenhek Hi, The reason that building nss (i.e., firefox) would segfault on ARM EABI systems is an assumption about the layout of the jmp_buf structure in the nspr library (which nss depends on) that does hold on old-ABI but no longer holds on EABI. The attached patch fixes this assumption, and fixes the shlibsign segfault during the building of nss (it also fixes a floating point byte order assumption.) Looks sane? It's of course a stupid idea to depend on a particular layout of the jmp_buf structure in application programs, but oh well. People write ugly buggy code, film at 11. --- mozilla/nsprpub/pr/src/misc/prdtoa.c.orig 2007-05-06 02:39:00.000000000 +0200 +++ mozilla/nsprpub/pr/src/misc/prdtoa.c 2007-05-06 02:39:22.000000000 +0200 @@ -59,8 +59,8 @@ /* FIXME: deal with freelist and p5s. */ } -#if defined(__arm) || defined(__arm__) || defined(__arm26__) \ - || defined(__arm32__) +#if (defined(__arm) || defined(__arm__) || defined(__arm26__) \ + || defined(__arm32__)) && !defined(__ARM_EABI__) && !defined(__ARMEB__) #define IEEE_ARM #elif defined(IS_LITTLE_ENDIAN) #define IEEE_8087 --- mozilla/nsprpub/pr/include/md/_linux.h.orig 2007-05-06 02:39:45.000000000 +0200 +++ mozilla/nsprpub/pr/include/md/_linux.h 2007-05-06 02:40:57.000000000 +0200 @@ -346,7 +346,7 @@ #error "Linux/MIPS pre-glibc2 not supported yet" #endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */ -#elif defined(__arm__) +#elif defined(__arm__) && !defined(__ARM_EABI__) /* ARM/Linux */ #if defined(__GLIBC__) && __GLIBC__ >= 2 #define _MD_GET_SP(_t) (_t)->md.context[0].__jmpbuf[20] @@ -358,6 +358,18 @@ #error "ARM/Linux pre-glibc2 not supported yet" #endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */ +#elif defined(__arm__) && defined(__ARM_EABI__) +/* ARM/Linux */ +#if defined(__GLIBC__) && __GLIBC__ >= 2 +#define _MD_GET_SP(_t) (_t)->md.context[0].__jmpbuf[8] +#define _MD_SET_FP(_t, val) ((_t)->md.context[0].__jmpbuf[7] = (val)) +#define _MD_GET_SP_PTR(_t) &(_MD_GET_SP(_t)) +#define _MD_GET_FP_PTR(_t) (&(_t)->md.context[0].__jmpbuf[7]) +#define _MD_SP_TYPE __ptr_t +#else +#error "ARM/Linux pre-glibc2 not supported yet" +#endif /* defined(__GLIBC__) && __GLIBC__ >= 2 */ + #else #error "Unknown CPU architecture"