<div dir="ltr">Hi Vladimir,<div><br></div><div>This seems fine, but I am a bit concerned that this misuses an inconsistency in the API, namely the fact that <span style="color:rgb(0,0,0)">specifies_noexecstack() behaves differently than all other functions (re-read the file each time it is called instead of using cached information). In order to understand the "load_tables" argument in the constructor, one has to understand that odd design, and know that load_tables=false means the only method which can be used is </span><span style="color:rgb(0,0,0)">specifies_noexecstack().</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div>As a proposal, could you instead make <span style="color:rgb(0,0,0)">specifies_noexecstack() a static function in ElfFile, such that:</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,0)">static bool ElfFile::specifies_noexecstack(const char* filename);</span><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,0)">Then it would be immediately clear that this function is to be used without constructing the ElfFile object. </span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,0)">Kind Regards, Thomas</span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 30, 2017 at 7:07 PM, Vladimir Kozlov <span dir="ltr"><<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">webrev: <a href="http://cr.openjdk.java.net/~kvn/8183262/webrev/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~kv<wbr>n/8183262/webrev/</a><br>
<a href="https://bugs.openjdk.java.net/browse/JDK-8183262" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net/<wbr>browse/JDK-8183262</a><br>
<br>
To load AOT library we use os::dll_load() method provided on all platforms.<br>
<br>
During investigation why AOT library load takes so long on Linux I found that it spend most of time in ElfFile::load_tables() method which looks for string tables in library. It is called from ElfFile() constructor used in os::dll_load() just to check if library is built with noexecstack:<br>
<br>
 if (os::uses_stack_guard_pages() && !os::Linux::_stack_is_executab<wbr>le) {<br>
   ElfFile ef(filename);<br>
   if (!ef.specifies_noexecstack()) {<br>
<br>
There is no need for string tables load in such case. Avoiding loads helps a lot:<br>
<br>
without fix:<br>
<br>
[0.047s][info][aot,startuptime<wbr>] AOT initialization, 0.0424919 secs<br>
<br>
with fix:<br>
<br>
[0.002s][info][aot,startuptime<wbr>] AOT initialization, 0.0002087 secs<br>
<br>
<br>
Note, JDK 9 is not affected because AOT uses system dlopen() since only Linux is supported.<br>
<br>
Thanks,<br>
Vladimir<br>
</blockquote></div><br></div>