This is the mail archive of the libc-locales@sourceware.org mailing list for the GNU libc locales project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: localedef malfunctioning


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.
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]