This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


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

Re: compile failure for powerpc with latest CVS


On Thursday 08 March 2001 19:31, Ben Collins wrote:
> I get this compile failure (with backtrace) when compiling on ppc-linux:
>
>
> /usr/src/glibc/glibc-2.2.2/powerpc-linux/obj/elf/sln
> /usr/src/glibc/glibc-2.2.2/powerpc-linux/obj/elf/symlink.list make[2]: ***
> [install-symbolic-link] Segmentation fault
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x10000928 in atexit (func=0x1004d348 <_fini>) at atexit.c:31
> 31        return __cxa_atexit ((void (*) (void *)) func, NULL,
> (gdb) bt full
> #0  0x10000928 in atexit (func=0x1004d348 <_fini>) at atexit.c:31
> No locals.
> #1  0x1000078c in __libc_start_main (argc=2, ubp_av=0x7ffffb94,
> ubp_ev=0x7ffffba0, auxvec=0x7ffffbe9, rtld_fini=0x1004d348 <_fini>,
> stinfo=0x1004d370, stack_on_entry=0x53) at
> ../sysdeps/powerpc/elf/libc-start.c:104
>         dummy_addr = (int *) 0x0

I was just looking at this after the same report from Kaoro. This is caused 
by a deficiency of gcc (all versions AFICS), constructs like

	&__dso_handle ? __dso_handle : 0

are not safe if __dso_handle is a weak symbol. See this comment in rtlanal.c:

/* Return 0 if the use of X as an address in a MEM can cause a trap.  */
 
static int
rtx_addr_can_trap_p (x)
     register rtx x;
{
  register enum rtx_code code = GET_CODE (x);
 
  switch (code)
    {
    case SYMBOL_REF:
    case LABEL_REF:
      /* SYMBOL_REF is problematic due to the possible presence of
         a #pragma weak, but to say that loads from symbols can trap is
         *very* costly.  It's not at all clear what's best here.  For
         now, we ignore the impact of #pragma weak.  */
      return 0;
...

So if such constructs work in glibc, it's by luck and not by design :-(. 
Maybe it's enough if all glibc files containing such constructs are compiled 
with -O0/-O1? Or create a separate function? Or even better, trick the 
compiler:

#define PROTECT_WEAK_SYM(SYM) ({ __asm__ __volatile__(""); SYM;})
 
int
atexit (void (*func) (void))
{
  return __cxa_atexit ((void (*) (void *)) func, NULL,
                       &__dso_handle == NULL  ? NULL :
                       PROTECT_WEAK_SYM(__dso_handle));
}

This seems to work fine.

Franz.


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