Bug#179781: __fixunsdfdi should be provided by libgcc_s.so.1
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
Reply to: