Here's an updated webrev that uses the same pattern as for native shared
libraries to hide non-exported symbols, for executables as well.
I hope you're happy now :-)
WebRev:
http://cr.openjdk.java.net/~ihse/JDK-8200358-remove-launcher-mapfiles/webrev.02
I know there's a bit of redundancy now for setting -fvisibility=hidden
and friends. I'll clean that up going forward.
/Magnus
On 2018-03-29 07:48, Martin Buchholz wrote:
On Wed, Mar 28, 2018 at 2:48 PM, Magnus Ihse Bursie
<magnus.ihse.bur...@oracle.com <mailto:magnus.ihse.bur...@oracle.com>>
wrote:
On 2018-03-28 22:39, Martin Buchholz wrote:
On Wed, Mar 28, 2018 at 12:07 PM, Magnus Ihse Bursie
<magnus.ihse.bur...@oracle.com
<mailto:magnus.ihse.bur...@oracle.com>> wrote:
Anyway, with this patch all symbols in executables will be
visible, so there should be no problem anyway.
The symbols visible in the main executable are a sort-of-public
interface. The difference is visible via e.g. nm -D, or any
native code that does dlsym(NULL, symbolName) (yes, we do
this!). The behavior of native code is likely to be affected if
there is a symbol conflict. The larger the exported symbol
table, the more overhead there will be at startup (probably). The
theory is that changing an interface requires a CSR.
If I understand your objections correctly, you are claiming
(correct me if I'm misunderstanding you):
1) Removing the mapfiles will affect performance negatively
2) The exported symbols from executables are a public API and the
change therefore require a CSR.
To this I reply:
1) While theoretically this might affect startup time, I can't for
the life of me think this would even be measurable. I think any
uncertainities in the measurement of the startup of "java" will
dwarf any changes due to loading with a different set of exported
symbols, in several orders of magnitude. If you claim otherwise, I
challenge you to do the measurements.
It's true the performance loss here is very small - every java program
might be a microsecond slower to start up.
2) If this is a public API, then show me the documentation. If
there is no documentation, then this is not a public interface.
Just the fact that you might have used "nm" to locate symbols in a
native file and use it, does not mean it's a public interface that
requires a CSR to change. If that would be the case, then we could
not ever do any change to any native file without filing a CSR,
which is obviously absurd.
Jigsaw team just spent 10 years working to prevent people from
accessing Java internals. But here the proposal for ELF symbols is
"just make everything public" Every ELF symbol that is needlessly
exported is something that someone might build a dependency on or
might cause a name conflict. ELF files don't have much encapsulation
- all they have is public and private.
If you have code that are dependent on a certain set of symbols or
whatnot, and you want it to keep functioning, then I recommend
that you file a bug and submit a patch to get it into mainline. If
you're just collecting a bunch of downstream patches, and this
change make your life harder, well, then, sorry, that's not my
problem.
No, actually making everything public/exporting all symbols will
probably make Google local changes easier to maintain - no map files!
I would prefer if build team worked on generating map files with
minimal symbols exported, instead of removing them entirely.