Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Tue, 12 Feb 2019 12:05:17 -0500
From: David Edelsohn <dje.gcc@...il.com>
To: musl@...ts.openwall.com
Subject: Re: [PATCH] powerpc64: use a type for mcontext_t regs field

On Tue, Feb 12, 2019 at 11:18 AM Rich Felker <dalias@...c.org> wrote:
>
> On Tue, Feb 12, 2019 at 09:35:22AM -0600, A. Wilcox wrote:
> > GCC Go dereferences `regs` for `nip`.  Without this change, compilation
> > fails with the following message:
> >
> > .../../../libgo/runtime/go-signal.c: In function ‘getSiginfo’:
> > .../../../libgo/runtime/go-signal.c:225:56: warning: dereferencing ‘void *’ pointer
> >   ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.regs->nip;
> >                                                         ^~
> > .../../../libgo/runtime/go-signal.c:225:56: error: request for member ‘nip’ in something not a structure or union
> > ---
> >  arch/powerpc64/bits/signal.h | 4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/arch/powerpc64/bits/signal.h b/arch/powerpc64/bits/signal.h
> > index 34693a68..6736c69a 100644
> > --- a/arch/powerpc64/bits/signal.h
> > +++ b/arch/powerpc64/bits/signal.h
> > @@ -8,6 +8,8 @@
> >
> >  #if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
> >
> > +#include <bits/user.h>
> > +
>
> This is almost surely not right. You can never use a bits/* header
> except from the corresponding public header that includes it. They do
> not have multiple-inclusion guards and are not designed to be usable
> independently. And including sys/user.h is also almost surely wrong
> since it's a problematic header you don't want getting included
> (conflicts with linux/*.h stuff).
>
> >  typedef unsigned long greg_t, gregset_t[48];
> >
> >  typedef struct {
> > @@ -29,7 +31,7 @@ typedef struct sigcontext {
> >       int _pad0;
> >       unsigned long handler;
> >       unsigned long oldmask;
> > -     void *regs;
> > +     struct pt_regs *regs;
> >       gregset_t gp_regs;
> >       fpregset_t fp_regs;
> >       vrregset_t *v_regs;
> > --
> > 2.19.2
>
> Do you know if there's a reason Go is trying to use this regs member
> rather than gp_regs? I think that's the real issue here.

Apparently GCCGo runtime has dependencies on GLibc and has not been
ported to Musl Libc.  The GCCGo runtime is trying to obtain the PC for
a signal.

#ifdef __PPC__
 #ifdef __linux__
       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.regs->nip;
 #endif
 #ifdef _AIX
       ret.sigpc = ((ucontext_t*)(context))->uc_mcontext.jmp_context.iar;
 #endif
#endif

The program counter is not part of gp_regs.

I presume that someone is trying to use GCCGo with Alpine Linux.  I
believe that Golang works with Alpine Linux.

Thanks, David

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.