ARM glibc's __aeabi_localeconv does: struct lconv * __aeabi_localeconv (void) { return __localeconv (); } However, glibc orders the C99 fields in struct lconv thus: char int_p_cs_precedes; char int_p_sep_by_space; char int_n_cs_precedes; char int_n_sep_by_space; char int_p_sign_posn; char int_n_sign_posn; but the __aeabi_lconv structure (defined in CLIBABI, ARM IHI 0039) has them ordered thus: char int_p_cs_precedes; char int_n_cs_precedes; char int_p_sep_by_space; char int_n_sep_by_space; char int_p_sign_posn; char int_n_sign_posn; and so a conversion layer is needed to swap int_p_sep_by_space and int_n_cs_precedes.