Opening -javaagent classes to named modules
Fabian Meumertzheim
meumertzheim at code-intelligence.com
Tue May 11 15:35:39 UTC 2021
Thanks a lot, that works very well. I had already redefined all modules I
encountered, but was not adding the agent JAR to the bootstrap search path.
Fabian
On Tue, May 11, 2021 at 5:18 PM Alan Bateman <Alan.Bateman at oracle.com>
wrote:
> On 11/05/2021 16:10, Fabian Meumertzheim wrote:
> > I am currently working on a JVM fuzzer (
> > https://github.com/CodeIntelligenceTesting/jazzer/) and would like to
> apply
> > it also to classes delivered with the JDK, e.g. the image parsers in
> > javax.imageio.* in the java.desktop module. The fuzzer uses a Java agent
> to
> > add coverage instrumentation (similar to JaCoCo) to classes at runtime.
> >
> > As opposed to JaCoCo, for technical reasons the fuzzer needs to inject
> > bytecode referencing a public static byte[] field defined on a class of
> the
> > agent. Since -javaagent does not support Java modules, this class will be
> > part of the unnamed module and thus can't be "opened" to other modules,
> > leading to a "NoClassDefFoundError" when the bytecode is injected into a
> > class in a different module, e.g. java.desktop.
> >
> > Is there any way to have a Java agent open up a class for direct access
> by
> > named modules? I have full control over the JVM args within the fuzzer,
> but
> > haven't found a way to achieve this.
> I don't think this a modules issue, it's more likely a visibility issue
> because the boot class loader does not delegate to the application class
> loader. If you are instrumenting classes in java.desktop to call into
> some supporting classes that the agent provides then you need those
> class on the boot class path.
> Instrumentation::appendToBootstrapClassLoaderSearch is the API for that.
> You'll also need to use redefineModule to change java.desktop to read
> the unnamed module of the boot class loader.
>
> -Alan
>
More information about the jigsaw-dev
mailing list