[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: