At Mon, 10 Feb 2003 01:58:43 +0900,
GOTO Masanori wrote:
> At Sun, 9 Feb 2003 14:45:18 +0100,
> Guido Guenther wrote:
> > if I understand this correctly the missing symbol is provided by
> > libgcc_s.so.1, not by glibc: 
> > nm -D --defined-only /lib/libgcc_s.so.1 | grep __fixunsdfdi
> > 000017c0 T __fixunsdfdi
> > Glibc only provides these symbols versioned as @GLIBC_2_0 on some
> > architectures for backward compatibility. The program works without
> > problems when one uses:
> >  LD_PRELOAD=/lib/libgcc_s.so.1 dcgui 
> > so I think something went wrong when linking this program. IMHO there's
> > nothing glibc can do about it.
> 
> Good analysis.  I also think it's gcc problem.

OK, now I found this is gcc problem (or gcc normal behavior).

>       wurlitzer:~/bugs/179781/glib2.0-2.2.1/build-tree/glib-2.2.1/gobject> diff -e 
>gvaluetransform.c.org gvaluetransform.c
>       137,441d
>       133c
>       //DEFINE_CAST (double_uint64,     v_double, guint64, v_uint64);
>       .
> 
>       wurlitzer:~/bugs/179781/glib2.0-2.2.1/build-tree/glib-2.2.1/gobject> objdump 
>-x gvaluetransform.o | grep __fixunsdfdi
>       wurlitzer:~/bugs/179781/glib2.0-2.2.1/build-tree/glib-2.2.1/gobject>
>       
> This __fixunsdfdi is vanished!  I also changed it as:
> 
>       DEFINE_CAST (double_uint64,     v_double, gint64, v_uint64);
>                                                 ^^^^^^
> This also fixes the problem.
> The conclusion is:
> 
>       - dcgui should be rebuilt with the latest sid environment.
>       - gobject in glib2.2 still has problem, it's related with this define_cast.

Look at below run:

        gotom@celesta:/tmp> cat a.c
        main()
        {
                double Xd;
                float  Xf;
                unsigned long long int a;
                  signed long long int b;
                unsigned long      int c;
                  signed long      int d;
        
                  a = Xd;       /* XXX __fixunsdfdi : __fixunsdfDI */
                  b = Xd;       /*     __fix   dfdi */
                  c = Xd;       /*     __fixunsdfsi */
                  d = Xd;
                  a = Xf;       /* XXX __fixunssfdi */
                  b = Xf;
                  c = Xf;
                  d = Xf;
        }
        gotom@celesta:/tmp> gcc -S a.c
        gotom@celesta:/tmp> head -17 a.s
                .file   "a.c"
        .globl __fixunsdfdi
        .globl __fixunssfdi
                .text
        .globl main
                .type   main,@function
        main:
                pushl   %ebp
                movl    %esp, %ebp
                subl    $56, %esp
                andl    $-16, %esp
                movl    $0, %eax
                subl    %eax, %esp
                subl    $8, %esp
                pushl   -4(%ebp)
                pushl   -8(%ebp)
                call    __fixunsdfdi

You find that __fixunsdfdi (double -> unsigned long long int) and
__fixunssfdf (float -> unsinged long long int) becomes .globl symbol.

I wonder why __fixdfdi (double -> signed long long int) and
__fixunsdfsi (double -> unsinged long int) does not appear...
And I also wonder why __fixunsdfdi appears as .globl symbol.
I don't know it's gcc natural behavior or not.

At least this is not glibc things, so I reassing it to gcc-3.2.

Regards,
-- gotom


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to