Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 Mar 2022 11:36:13 +0900
From:      Tomoaki AOKI <junchoon@dec.sakura.ne.jp>
To:        Dimitry Andric <dim@FreeBSD.org>
Cc:        John Baldwin <jhb@freebsd.org>, Ed Maste <emaste@freebsd.org>, dev-commits-src-branches@freebsd.org
Subject:   Re: git: b2127b6f1ae2 - stable/13 - Install unwind.h into /usr/include
Message-ID:  <20220305113613.7760bb3845cda1c04707fb34@dec.sakura.ne.jp>
In-Reply-To: <6E5AD771-3140-480A-BF20-95B8E8A27189@FreeBSD.org>
References:  <20220303224535.a0cca57e1f033e930a7f8f9d@dec.sakura.ne.jp> <3166E99F-1616-40D9-BD8B-D18E8104D6FF@FreeBSD.org> <a9863238-04e5-381d-105d-311a2b0c3f56@FreeBSD.org> <6E5AD771-3140-480A-BF20-95B8E8A27189@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 4 Mar 2022 19:25:06 +0100
Dimitry Andric <dim@FreeBSD.org> wrote:

> On 3 Mar 2022, at 21:30, John Baldwin <jhb@freebsd.org> wrote:
> > 
> > On 3/3/22 10:08 AM, Dimitry Andric wrote:
> >> I can't even get to building libreoffice, as all the openjdk ports fail to build, with DTrace errors:
> >> dtrace: failed to compile script /wrkdirs/share/dim/ports/java/openjdk12/work/openjdk-jdk12u-jdk-12.0.2-10-4/build/bsd-x86_64-server-release/hotspot/variant-server/support/dtrace/hotspot.h.d: "/u
> >> /mbuf.d", line 1: failed to copy type of 'm_data': Type information is in parent and unavailable
> >> * For target hotspot_variant-server_gensrc_dtracefiles_hotspot_jni.h:
> >> dtrace: failed to compile script /wrkdirs/share/dim/ports/java/openjdk12/work/openjdk-jdk12u-jdk-12.0.2-10-4/build/bsd-x86_64-server-release/hotspot/variant-server/support/dtrace/hotspot_jni.h.d:
> >> race/mbuf.d", line 1: failed to copy type of 'm_data': Type information is in parent and unavailable
> >> * For target hotspot_variant-server_gensrc_dtracefiles_hs_private.h:
> >> dtrace: failed to compile script /wrkdirs/share/dim/ports/java/openjdk12/work/openjdk-jdk12u-jdk-12.0.2-10-4/build/bsd-x86_64-server-release/hotspot/variant-server/support/dtrace/hs_private.h.d:
> >> ace/mbuf.d", line 1: failed to copy type of 'm_data': Type information is in parent and unavailable
> >> It seems there is no way to disable DTrace in the openjdk ports, so I'm a little stuck on this.
> >> Maybe it is possible to build libreoffice without Java support? But then I don't know if I will get the same error as you're getting.
> >> -Dimitry
> > 
> > It might also be helpful to not re-use the same PR for multiple issues.  (When I
> > first started reading the PR it was hard to understand why unwind.h had broken
> > openjpeg.)
> > 
> > If I have read it correctly, some build tool (gengal?) is now segfaulting during
> > the build.  My initial guess is that the build tool decided to alter its behavior
> > based on a configure-type check finding unwind.h and enabling some bit of
> > functionality that previously was not enabled.
> 
> So here's what apppears to be happening:
> 
> Core was generated by `/wrkdirs/share/dim/ports/editors/libreoffice/work/libreoffice-7.3.0.3/instdir/pr'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> Address not mapped to object.
> #0  std::type_info::name (this=0x0) at /usr/include/c++/v1/typeinfo:318
> 318           return __impl::__type_name_to_string(__type_name);
> 
> this=NULL, that's never good. :)
> 
> (gdb) bt
> #0  std::type_info::name (this=0x0) at /usr/include/c++/v1/typeinfo:318
> #1  gcc3::deleteException (pExc=0x87b5aff00)
>     at bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx:139
> #2  0x000000082c2e92e7 in __cxa_free_exception (
>     thrown_exception=0x87b5aff00)
>     at /share/dim/src/freebsd/llvm-14-update/contrib/libcxxrt/exception.cc:627
> #3  0x000000082a4e6a15 in FileExists (rURL=...)
>     at svx/source/gallery2/galmisc.cxx:214
> #4  0x000000082a4f5871 in GalleryBinaryStorageLocations::ImplGetURLIgnoreCase (rURL=...)
>     at svx/source/gallery2/gallerybinarystoragelocations.cxx:28
> #5  0x000000082a4f4ac7 in GalleryBinaryEngineEntry::CreateUniqueURL (
>     rBaseURL=..., aURL=...)
>     at svx/source/gallery2/gallerybinaryengineentry.cxx:56
> #6  0x000000082a4e2543 in GalleryThemeEntry::GalleryThemeEntry (
>     this=0x87b56b4a0, bCreateUniqueURL=true, rBaseURL=..., rName=...,
>     _bReadOnly=false, _bNewFile=false, _nId=0,
>     _bThemeNameFromResource=<optimized out>)
>     at svx/source/gallery2/gallery1.cxx:123
> #7  0x000000082a4e4c20 in Gallery::CreateTheme (this=0x87a2fffc0,
>     rThemeName=...) at svx/source/gallery2/gallery1.cxx:582
> #8  0x0000000000207105 in createTheme (aThemeName=...,
>     aGalleryURL=..., aDestDir=..., rFiles=...,
>     bRelativeURLs=<optimized out>) at svx/source/gengal/gengal.cxx:72
> #9  (anonymous namespace)::GalApp::Main (
>     this=0x20db98 <vclmain::createApplication()::aGalApp>)
>     at svx/source/gengal/gengal.cxx:294
> #10 0x000000082e571d3e in ImplSVMain ()
>     at vcl/source/app/svmain.cxx:199
> #11 0x000000082e5730aa in SVMain () at vcl/source/app/svmain.cxx:231
> #12 0x000000000020a5df in sal_main ()
>     at vcl/source/salmain/salmain.cxx:34
> #13 main (argc=<optimized out>, argv=<optimized out>)
>     at vcl/source/salmain/salmain.cxx:29
> (gdb) up
> #1  gcc3::deleteException (pExc=0x87b5aff00)
>     at bridges/source/cpp_uno/gcc3_linux_x86-64/except.cxx:139
> 139         OUString unoName( toUNOname( header->exceptionType->name() ) );
> (gdb) print *header
> $7 = {referenceCount = 0, exceptionType = 0x0,
>   exceptionDestructor = 0x825fc9ad0 <typeinfo for com::sun::star::ucb::InteractiveAugmentedIOException>,
>   unexpectedHandler = 0x875b3a220 <gcc3::deleteException(void*)>,
>   terminateHandler = 0x82c2e9510 <std::terminate()>,
>   nextException = 0x83041e0e0 <abort>, handlerCount = 0,
>   handlerSwitchValue = 0, actionRecord = 0x0,
>   languageSpecificData = 0x82a216508 "\003}\004",
>   catchTemp = 0x82a2164cc, adjustedPtr = 0x0, unwindHeader = {
>     exception_class = 5138137972254386944,
>     exception_cleanup = 0x82c2e9990 <exception_cleanup(_Unwind_Reason_Code, _Unwind_Exception*)>, private_1 = 0, private_2 = 34912978464}}
> 
> The problem is that header->exceptionType is NULL. This appears to be
> because the offset for 'header' is 8 bytes off; there is an assert in
> except.cxx that checks this, but of course it gets compiled out for
> release mode:
> 
>     assert(header->exceptionDestructor == &deleteException);
> 
> (gdb) print header->exceptionDestructor
> $8 = (void (*)(void *)) 0x825fc9ad0 <typeinfo for com::sun::star::ucb::InteractiveAugmentedIOException>
> (gdb) print &gcc3::deleteException
> $10 = (void (*)(void *)) 0x875b3a220 <gcc3::deleteException(void*)>
> 
> So those definitely don't match, the header is in the wrong spot. If you
> shift it 8 bytes up, it starts looking better:
> 
> (gdb) print *(const __cxa_exception *)((const char *)header + 8)
> $11 = {referenceCount = 0,
>   exceptionType = 0x825fc9ad0 <typeinfo for com::sun::star::ucb::InteractiveAugmentedIOException>,
>   exceptionDestructor = 0x875b3a220 <gcc3::deleteException(void*)>,
>   unexpectedHandler = 0x82c2e9510 <std::terminate()>,
>   terminateHandler = 0x83041e0e0 <abort>, nextException = 0x0,
>   handlerCount = 0, handlerSwitchValue = 0,
>   actionRecord = 0x82a216508 "\003}\004",
>   languageSpecificData = 0x82a2164cc "\377\233M\001\061\067\021\243\003\aP\t\373\002\aY\025\334\002\az\003\261\002\t\211\001\003\251\002\t\310\001\020\271\002\a\356\002\003\363\002\t\215\003\003\233\003\t\220\003Z", catchTemp = 0x0, adjustedPtr = 0x87b5aff00, unwindHeader = {
>     exception_class = 35100989840, exception_cleanup = 0x0,
>     private_1 = 34912978464, private_2 = 36429320480}}
> 
> E.g. there the exceptionDestructor field exactly matches the address of
> gcc3::deleteException.
> 
> Interestingly, in except.cxx there is a large block with an explanatory
> comment, which tells how this might be caused, but it is *only* enabled
> for libc++abi, apparently:
> 
> #if defined _LIBCPPABI_VERSION // detect libc++abi
>     // First, the libcxxabi commit
>     // <http://llvm.org/viewvc/llvm-project?view=revision&revision=303175>;
>     // "[libcxxabi] Align unwindHeader on a double-word boundary" towards
>     // LLVM 5.0 changed the size of __cxa_exception by adding
>     //
>     //   __attribute__((aligned))
>     //
>     // to the final member unwindHeader, on x86-64 effectively adding a hole of
>     // size 8 in front of that member (changing its offset from 88 to 96,
>     // sizeof(__cxa_exception) from 120 to 128, and alignof(__cxa_exception)
>     // from 8 to 16); the "header1" hack below to dynamically determine whether we run against a
>     // LLVM 5 libcxxabi is to look at the exceptionDestructor member, which must
>     // point to this function (the use of __cxa_exception in fillUnoException is
>     // unaffected, as it only accesses members towards the start of the struct,
>     // through a pointer known to actually point at the start).  The libcxxabi commit
>     // <https://github.com/llvm/llvm-project/commit/9ef1daa46edb80c47d0486148c0afc4e0d83ddcf>;
>     // "Insert padding before the __cxa_exception header to ensure the thrown" in LLVM 6
>     // removes the need for this hack, so the "header1" hack can be removed again once we can be
>     // sure that we only run against libcxxabi from LLVM >= 6.
>     //
>     // Second, the libcxxabi commit
>     // <https://github.com/llvm/llvm-project/commit/674ec1eb16678b8addc02a4b0534ab383d22fa77>;
>     // "[libcxxabi] Insert padding in __cxa_exception struct for compatibility" in LLVM 10 changed
>     // the layout of the start of __cxa_exception to
>     //
>     //  [8 byte  void *reserve]
>     //   8 byte  size_t referenceCount
>     //
>     // so the "header2" hack below to dynamically determine whether we run against a LLVM >= 10
>     // libcxxabi is to look whether the exceptionDestructor (with its known value) has increased its
>     // offset by 8.  As described in the definition of __cxa_exception
>     // (bridges/source/cpp_uno/gcc3_linux_x86-64/share.hxx), the "header2" hack (together with the
>     // "#if 0" in the definition of __cxa_exception and the corresponding hack in fillUnoException)
>     // can be dropped once we can be sure that we only run against new libcxxabi that has the
>     // reserve member.
>     if (header->exceptionDestructor != &deleteException) {
>         auto const header1 = reinterpret_cast<__cxa_exception const *>(
>             reinterpret_cast<char const *>(header) - 8);
>         if (header1->exceptionDestructor == &deleteException) {
>             header = header1;
>         } else {
>             auto const header2 = reinterpret_cast<__cxa_exception const *>(
>                 reinterpret_cast<char const *>(header) + 8);
>             if (header2->exceptionDestructor == &deleteException) {
>                 header = header2;
>             } else {
>                 assert(false);
>             }
>         }
>     }
> #endif
> 
> I remember that we have had an earlier issue which was related to this
> shifting up and down by 8 bytes, as there is a part in libcxxrt's
> exception.cc about this:
> 
> #ifdef __LP64__
> /**
>  * There's an ABI bug in __cxa_exception: unwindHeader requires 16-byte
>  * alignment but it was broken by the addition of the referenceCount.
>  * The unwindHeader is at offset 0x58 in __cxa_exception.  In order to keep
>  * compatibility with consumers of the broken __cxa_exception, explicitly add
>  * padding on allocation (and account for it on free).
>  */
> static const int exception_alignment_padding = 8;
> #else
> static const int exception_alignment_padding = 0;
> #endif
> 
> However, previously with libcxxrt's own unwind.h headers installed,
> libreoffice didn't need to do anything special to get at the correct
> header address.
> 
> For some reason, with the libunwind headers instead, it now gets shifted
> by 8 bytes. I think we are having a case of kludges upon kludges upon
> hacks, which is now falling apart... :-)
> 
> In any case, if I unconditionally enable the "#if defined
> _LIBCPPABI_VERSION // detect libc++abi" block in except.cxx, it does
> detect the exception header successfully, the gengal.bin command does
> not crash anymore, and the whole libreoffice build succeeds. The
> libreoffice binaries even run OK, though I only did light testing, like
> opening a doc file and messing around with it a little bit.
> 
> But I'm not sure if it is the solution we want. Maybe we should again
> put in some sort of compat hack, to make the libunwind/libcxxrt
> combination work for this scenario? (I think libreoffice is one of the
> few applications that calls __cxa_throw directly, with its own deleter
> function...)
> 
> -Dimitry
> 

Thanks for your hard work!
Maybe, editors/libreoffice should adapt to the change if __UNWIND_H__
is defined in /usr/include/unwind.h, but if some others (including
not-yet-ported softwares) have the same problem, compat hack on base
would be better preferred.

If there is a standard way to avoid this (use already-existing wrapper
function?), it would be better fixing editors/libreoffice with some
hints written into porter's handbook.


-- 
Tomoaki AOKI    <junchoon@dec.sakura.ne.jp>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20220305113613.7760bb3845cda1c04707fb34>