pkgsrc-Users archive

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

Re: lang/perl5 broken Makefile



On Fri, 3 May 2019 11:01:42 +0100
Sad Clouds <cryintothebluesky%gmail.com@localhost> wrote:

> On Fri, 03 May 2019 17:36:14 +0900 (JST)
> Takahiro Kambe <taca%NetBSD.org@localhost> wrote:
> 
> > In message <20190503092747.89c9730671cf7e46b134acc6%googlemail.com@localhost>
> > 	on Fri, 3 May 2019 09:27:47 +0100,
> > 	Sad Clouds <cryintothebluesky%gmail.com@localhost> wrote:
> > > Hello, if anyone out there maintaining this package, please note
> > > this does not work on Solaris with its native find command.
> > Hi,
> > 
> > I commited a fix not to use "-delete" option of find(1).
> > Please try again.
> > 
> > -- 
> > Takahiro Kambe <taca%NetBSD.org@localhost>
> 
> 
> Hello, thanks for the fix, I've previously commented out that line
> from Makefile, but looks like either Perl or GCC is buggy, this may
> need to go upstream. I'm actually using GCC 8.3.0
> 
> Here is where it fails:
> 
> LD_LIBRARY_PATH=/opt/pkgbuild/objects/lang/perl5/work/perl-5.28.2 ./miniperl
> -w -Ilib -Idist/Exporter/lib -MExporter -e '<?>' || sh -c 'echo >&2
> Failed to build miniperl.  Please run make minitest; exit 1' bash:
> line 7:  5826 Bus Error               (core dumped)
> LD_LIBRARY_PATH=/opt/pkgbuild/objects/lang/perl5/work/perl-5.28.2 ./miniperl
> -w -Ilib -Idist/Exporter/lib -MExporter -e '<?>' Failed to build
> miniperl. Please run make minitest *** [lib/buildcustomize.pl] Error
> code 1 (ignored)
> LD_LIBRARY_PATH=/opt/pkgbuild/objects/lang/perl5/work/perl-5.28.2 ./miniperl
> -Ilib make_patchnum.pl bash: line 3:  5829 Bus Error
> (core dumped)
> LD_LIBRARY_PATH=/opt/pkgbuild/objects/lang/perl5/work/perl-5.28.2 ./miniperl
> -Ilib make_patchnum.pl *** [lib/Config_git.pl] Error code 138
> 
> bmake: stopped in /opt/pkgbuild/objects/lang/perl5/work/perl-5.28.2
> 1 error
> 
> 
> I compiled with debug symbols and looked at core dump:
> 
> Core was generated by `./miniperl -Ilib make_patchnum.pl'.
> Program terminated with signal 10, Bus error.
> #0  zaphod32_hash_with_state (key_len=25, key=0xffbff9da
> #"ALLOW_VULNERABLE_PACKAGES=", state_ch=<optimized out>) at
> #zaphod32_hash.h:280
> 280                 v1 -= U8TO32_LE(key+0);
> (gdb) bt
> #0  zaphod32_hash_with_state (key_len=25, key=0xffbff9da
> #"ALLOW_VULNERABLE_PACKAGES=", state_ch=<optimized out>) at
> #zaphod32_hash.h:280 1  Perl_hv_common (my_perl=0x290008,
> #hv=0x32cd18, keysv=0x0, key=0xffbff9da "ALLOW_VULNERABLE_PACKAGES=",
> #klen=<optimized out>, flags=0, 
>     action=8, val=0x0, hash=<optimized out>) at hv.c:633
> #2  0x001afe00 in Perl_hv_common_key_len (my_perl=0x290008,
> #hv=0x32cd18, key=0xffbff9da "ALLOW_VULNERABLE_PACKAGES=", 
>     klen_i32=<optimized out>, action=8, val=0x0, hash=<optimized
> out>) at hv.c:337
> #3  0x0011bf00 in S_init_postdump_symbols (my_perl=0x290008,
> #argc=<optimized out>, argv=<optimized out>, env=0xffbfed6c) at
> #perl.c:4560 4  0x001211e4 in S_parse_body (xsinit=<optimized out>,
> #env=<optimized out>, my_perl=<optimized out>) at perl.c:2434 5
> #perl_parse (my_perl=<optimized out>, xsinit=<optimized out>,
> #argc=<optimized out>, argv=<optimized out>, env=<optimized out>)
>     at perl.c:1803
> #6  0x0026dc9c in main (argc=<optimized out>, argv=<optimized out>,
> #env=<optimized out>) at miniperlmain.c:127
> 
> 
> Here is function prototype where key is a pointer to uint8_t:
> 
> ZAPHOD32_STATIC_INLINE
> U32 zaphod32_hash_with_state(
>     const U8 *state_ch,
>     const U8 *key,
>     const STRLEN key_len
> )
> 
> 
> This is where Bus Error happens when calling "v1 -= U8TO32_LE(key+0)"
> on line 280:
> 
>     {
> zaphod32_read8:
>         len = key_len & 0x7;
>         end = key + key_len - len;
>         do {
>             v1 -= U8TO32_LE(key+0);
>             v0 += U8TO32_LE(key+4);
>             ZAPHOD32_MIX(v0,v1,v2,"MIX 2-WORDS A");
>             key += 8;
>         } while ( key < end );
>     }
> 
> 
> Looking at macro for U8TO32_LE it looks like
> ZAPHOD32_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN is not defined, so not
> sure why the code in the #else part fails.
> 
> #ifndef U8TO32_LE
> #if ZAPHOD32_ALLOW_UNALIGNED_AND_LITTLE_ENDIAN
> #define U8TO32_LE(ptr)  (*((const U32 *)(ptr)))
> #else
> #define U8TO32_LE(ptr)  (\
>     (U32)(ptr)[3] << 24 | \
>     (U32)(ptr)[2] << 16 | \
>     (U32)(ptr)[1] << 8  | \
>     (U32)(ptr)[0]         \
> )
> #endif
> #endif
> 
> GDB disassembly shows
> 
> 0x1aea5c <Perl_hv_common+5308>  ld  [ %l5 ], %o0
> 0x1aea60 <Perl_hv_common+5312>  call  0x26d764 <__bswapsi2>
> 0x1aea64 <Perl_hv_common+5316>  st  %g1, [ %fp + -16 ]
> 0x1aea68 <Perl_hv_common+5320>  st  %o0, [ %fp + -12 ]
> 0x1aea6c <Perl_hv_common+5324>  call  0x26d764 <__bswapsi2>
> 0x1aea70 <Perl_hv_common+5328>  ld  [ %l5 + 4 ], %o0
> 0x1aea74 <Perl_hv_common+5332>  ld  [ %fp + -12 ], %g2
> 0x1aea78 <Perl_hv_common+5336>  ld  [ %fp + -16 ], %g1
> 
> Suspect GCC loads 32-bit integer and then calls internal __bswapsi2,
> so the load may be causing Bus Error since the actual data is an array
> of uint8_t objects.

So I found these in hv_macro.h and U32_ALIGNMENT_REQUIRED does not
seem to be defined on SPARC Solaris, so unsurprisingly it's using
unaligned loads, which fail. 

#ifndef U32_ALIGNMENT_REQUIRED
  #if (BYTEORDER == 0x1234 || BYTEORDER == 0x12345678)
    #define U8TO16_LE(ptr)   (*((const U16*)(ptr)))
    #define U8TO32_LE(ptr)   (*((const U32*)(ptr)))
    #define U8TO64_LE(ptr)   (*((const U64*)(ptr)))
  #elif (BYTEORDER == 0x4321 || BYTEORDER == 0x87654321)
    #if defined(__GNUC__) && (__GNUC__>4 || (__GNUC__==4 && __GNUC_MINOR__>=3))
      #define U8TO16_LE(ptr)   (__builtin_bswap16(*((U16*)(ptr))))
      #define U8TO32_LE(ptr)   (__builtin_bswap32(*((U32*)(ptr))))
      #define U8TO64_LE(ptr)   (__builtin_bswap64(*((U64*)(ptr))))
    #endif
  #endif
#endif


This is from config.h

/* U32_ALIGNMENT_REQUIRED:
 *      This symbol, if defined, indicates that you must access
 *      character data through U32-aligned pointers.
 */
#ifndef U32_ALIGNMENT_REQUIRED
/*#define U32_ALIGNMENT_REQUIRED        / **/
#endif

Anyone knows why the above ends up commented out on SPARC?


Home | Main Index | Thread Index | Old Index