RFR(S) 8205965: SIGSEGV on write to NativeCallStack::EMPTY_STACK

Zhengyu Gu zgu at redhat.com
Mon Jul 2 19:41:59 UTC 2018


Hi Martin,


On 07/02/2018 03:26 PM, Martin Buchholz wrote:
> Zhengyu,
> 
> Thanks for fixing this!
> 
> I would have tried to use /Construct On First Use Idiom/
> https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
> but nothing here is easy, unlike in Java with its static finals.
> (and I'm not (yet) a hotspot engineer)

Thanks for the link.

However, this pattern does not apply here, since we *cannot* allocate 
any objects at this point.

Hotspot disables global new operator, and allocates any CHeapObj here 
will loop back to initialize NMT (when it is on). We have to workaround 
this problem in several places, see comments in 
services/mallocSiteTable.hpp, for an example.

Thanks,

-Zhengyu

> 
> 
> On Fri, Jun 29, 2018 at 6:04 AM, Zhengyu Gu <zgu at redhat.com 
> <mailto:zgu at redhat.com>> wrote:
> 
>     Hi,
> 
>     clang-6.0 and above, can deduce that NativeCallStack::EMPTY_STACK is
>     all zeros, and since it is a static constant, it places the object
>     in the read-only BSS data section.
> 
>     To workaround static initialization ordering issue, NMT has to
>     ensure EMPTY_STACK is initialized before turns itself on, which can
>     happen in the middle of initialization of other static objects. In
>     this case, it causes SIGSEGV while try to write to the read-only memory.
> 
>     The solution is to make EMPTY_STACk private and non-constant, but
>     hands out constant version.
> 
>     Bug: https://bugs.openjdk.java.net/browse/JDK-8205965
>     <https://bugs.openjdk.java.net/browse/JDK-8205965>
>     Webrev: http://cr.openjdk.java.net/~zgu/8205965/webrev.00/
>     <http://cr.openjdk.java.net/~zgu/8205965/webrev.00/>
> 
>     Test:
> 
>        hotspot_nmt on Linux 64 (fastdebug and release)
> 
>     Thanks,
> 
>     -Zhengyu
> 
> 


More information about the hotspot-runtime-dev mailing list