This is the mail archive of the
libc-locales@sourceware.org
mailing list for the GNU libc locales project.
Re: localedef malfunctioning
- From: Anthony Newnam <anthony at bnovc dot com>
- To: libc-locales at sourceware dot org
- Date: Wed, 1 Jul 2009 08:52:33 -0500
- Subject: Re: localedef malfunctioning
- References: <2cba86720906290925i278822a6x912d0f9cc26b7d8@mail.gmail.com>
I've found some more information about this bug and was hoping that
someone would recognize it and maybe its been patched upstream.
The problem seems to be related to compile flags.
-fexpensive-optimizations -frename-registers -O2
generates a localedef that works, but
-fexpensive-optimizations -frename-registers -O2 -fomit-frame-pointer
OR
-fexpensive-optimizations -frename-registers -O2 -mapcs-frame
generate a localedef that generates a bad locale-archive.
I believe I can avoid compiling glibc with those flags, but I would
like to know what is causing this problem and fix it instead.
I'm using glibc-2.5 on ARM.
Thanks
On Mon, Jun 29, 2009 at 11:25 AM, Anthony Newnam<anthony@bnovc.com> wrote:
> After debugging for a few days a problem with string comparisons, I've
> realized that there is a problem with my locale-archive. When it is
> generated using a localedef that was created with symbols, less
> optimization, etc. it seems to work fine, but when it is compiled with
> more optimizations (I believe that's the difference) it breaks my
> locale-archive file.
>
> The code is being run on ARM and cross compiled. I have checked the
> /usr/share/i18n/locales directory on a working ("debug build") and a
> non-working ("release build") device, and they are identical.
>
> Here is the command I'm using to compile localedef, which was generated by poky:
> ccache arm-poky-linux-gnueabi-gcc -march=armv6j -mtune=arm1136jf-s
> -mfpu=vfp -mfloat-abi=softfp -nostdlib -nostartfiles -o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/localedef
> ?-Wl,-dynamic-linker=/lib/ld-linux.so.3
> -Lstaging/arm-poky-linux-gnueabi/lib
> -Wl,-rpath-link,staging/arm-poky-linux-gnueabi/lib -Wl,-O1
> -Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/csu/crt1.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/csu/crti.o
> `ccache arm-poky-linux-gnueabi-gcc -march=armv6j -mtune=arm1136jf-s
> -mfpu=vfp -mfloat-abi=softfp --print-file-name=crtbegin.o`
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/localedef.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-ctype.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-messages.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-monetary.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-numeric.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-time.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-paper.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-name.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-address.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-telephone.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-measurement.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-identification.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/ld-collate.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/charmap.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/linereader.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/locfile.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/repertoire.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/locarchive.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/md5.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/charmap-dir.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/simple-hash.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/xmalloc.o
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/locale/xstrdup.o
> ?-Wl,-rpath-link=armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/math:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/elf:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/dlfcn:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/nss:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/nis:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/rt:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/resolv:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/crypt:armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/nptl
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/libc.so.6
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/libc_nonshared.a
> -lgcc -Wl,--as-needed -lgcc_s ?-Wl,--no-as-needed `ccache
> arm-poky-linux-gnueabi-gcc -march=armv6j -mtune=arm1136jf-s -mfpu=vfp
> -mfloat-abi=softfp --print-file-name=crtend.o`
> armv6-poky-linux-gnueabi/glibc-2.5-r10/build-arm-poky-linux-gnueabi/csu/crtn.o
>
> Here is what I use to test. It should output 0,0, and it will output
> 0,1 with a broken localedef.
> #include <glibmm/ustring.h>
> #include <stdio.h>
> #include <errno.h>
>
> int main()
> {
> ? ?Glib::ustring str1("a");
> ? ?Glib::ustring str2("b");
> ? ?printf("Result: %i\n", (str1 == str2));
> ? ?setlocale(LC_ALL, "");
> ? ?printf("Result: %i\n", (str1 == str2));
> }
>
> == for ustring is overloaded to call ustring.compare(str2) which calls
> g_utf8_collate internally, which turns the strings into wchar_t*'s and
> calls wcscoll.
>
> Also, setting LOCPATH=/usr/share/i18n/locales makes the comparison
> always work, but I'm not sure why. This variable isn't even in the
> documentation, but I noticed it in STRCOLL in string/strcoll_l.c in
> glibc.
>
> Thank you for any information.
>