[parisc-linux] Constructor not run in 3.3.3, but does run in 3.0.4

Carlos O'Donell carlos at baldric.uwo.ca
Fri Jan 30 15:55:29 MST 2004


> When all is said and done it should print '0123456789', but right now it
> prints '012356789', skipping '4'. If I compile with gcc-3.0.4 it
> complains about:
> /home/carlos/src/glibc-work/src/libc/include/unistd.h:71: warning:
> `visibility' attribute directive ignored
> 
> 69 char *__canonicalize_directory_name_internal (__const char *__thisdir,
> 70                                               char *__buf,
> 71                                               size_t __size) attribute_hidden;
> 
> Seems like a red-herring. However, with gcc-3.0.4 everything works just
> fine. The order of the initializers is back to normal.
> 
> Is there any fragile system by which the linker finds and labels the
> executables 'init'?

I can see atleast two stubs missing in the gcc-3.3 compiled code:

---
     47         ea a0 c0 00     bv r0(r21)
     48 -       48 33 02 b8     ldw 15c(r1),r19                                
     49 -       2b 60 00 00     addil 0,dp,%r1
     50 -       48 35 02 40     ldw 120(r1),r21                                
     51 -       ea a0 c0 00     bv r0(r21)
     52 -       48 33 02 48     ldw 124(r1),r19                                
     53 -       2b 60 00 00     addil 0,dp,%r1
     54 -       48 35 02 a0     ldw 150(r1),r21                                
     55 -       ea a0 c0 00     bv r0(r21)
     56 -       48 33 02 a8     ldw 154(r1),r19                                
     57 +       48 33 02 b0     ldw 158(r1),r19                            
---

The old code called __do_global_ctors_aux directly, while the new code
seems to be running this through __canonicalize_funcptr_for_compare.
Same can be said for __do_global_dtors_aux.

I started poking the binary in order watch the insn flow, and the code
makes it into __do_global_ctors_aux, but the comparison in 10b9c fails,
and the constructor is never called. I guess I should be reviewing the
generic function pointer code.

---
00010b78 <__do_global_ctors_aux>:
   10b78:       6b c2 3f d9     stw rp,-14(sp)
   10b7c:       6f c4 01 00     stw,ma r4,80(sp)
   10b80:       6b c3 3f 09     stw r3,-7c(sp)
   10b84:       2b 60 00 00     addil 0,dp,%r1
   10b88:       34 23 02 18     ldo 10c(r1),r3
   10b8c:       e8 5f 1d 65     b,l 10a44 <__canonicalize_funcptr_for_compare>,rp
   10b90:       0c 60 10 9a     ldw 0(,r3),r26
   10b94:       34 1a 3f ff     ldi -1,r26
   10b98:       e8 5f 1d 4d     b,l 10a44 <__canonicalize_funcptr_for_compare>,rp
   10b9c:       08 1c 02 44     copy ret0,r4
   10ba0:       80 9c 20 22     cmpb,=,n ret0,r4,10bb8 <__do_global_ctors_aux+0x40>
   10ba4:       0c 60 10 96     ldw 0(,r3),r22
   10ba8:       eb ff 1c fd     b,l 10a2c <$$dyncall>,r31
   10bac:       08 1f 02 42     copy r31,rp
   10bb0:       e8 1f 1f ad     b,l 10b8c <__do_global_ctors_aux+0x14>,r0
   10bb4:       34 63 3f f9     ldo -4(r3),r3
   10bb8:       4b c2 3e d9     ldw -94(sp),rp
   10bbc:       4b c3 3f 09     ldw -7c(sp),r3
   10bc0:       e8 40 c0 00     bv r0(rp)
   10bc4:       4f c4 3f 01     ldw,mb -80(sp),r4
---

In the gcc-3.0.4 code the cffc is gone and the executables init runs
correctly. Time to review a few things :)

c.


More information about the parisc-linux mailing list