< prev index next >

src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/DefaultStripDebugPlugin.java

Print this page
@  rev 53690 : 8214796: Create a jlink plugin for stripping debug info symbols from native libraries
|  Reviewed-by: alanb, mchung, erikj
o  rev 53689 : 8218913: Rename --strip-debug jlink plugin
|  Reviewed-by: duke
~

@@ -23,10 +23,15 @@
  * questions.
  */
 
 package jdk.tools.jlink.internal.plugins;
 
+import java.util.Map;
+
+import jdk.tools.jlink.internal.PluginRepository;
+import jdk.tools.jlink.internal.ResourcePoolManager;
+import jdk.tools.jlink.internal.ResourcePoolManager.ResourcePoolImpl;
 import jdk.tools.jlink.plugin.Plugin;
 import jdk.tools.jlink.plugin.ResourcePool;
 import jdk.tools.jlink.plugin.ResourcePoolBuilder;
 
 /**

@@ -36,12 +41,26 @@
  * @author Severin Gehwolf
  */
 public final class DefaultStripDebugPlugin implements Plugin {
 
     public static final String NAME = "strip-debug";
+    private static final String STRIP_NATIVE_DEBUG_PLUGIN = "strip-native-debug-symbols";
+    private static final String OMIT_DEBUGINFO = "omit-debuginfo";
+
+    private final Plugin javaStripPlugin;
+    private final NativePluginFactory stripNativePluginFactory;
 
-    private final Plugin javaStripPlugin = new StripJavaDebugAttributesPlugin();
+    public DefaultStripDebugPlugin() {
+        this(new StripJavaDebugAttributesPlugin(),
+             new DefaultNativePluginFactory());
+    }
+
+    public DefaultStripDebugPlugin(Plugin javaStripPlugin,
+                                   NativePluginFactory nativeStripPluginFact) {
+        this.javaStripPlugin = javaStripPlugin;
+        this.stripNativePluginFactory = nativeStripPluginFact;
+    }
 
     @Override
     public String getName() {
         return NAME;
     }

@@ -51,9 +70,36 @@
         return PluginsResourceBundle.getDescription(NAME);
     }
 
     @Override
     public ResourcePool transform(ResourcePool in, ResourcePoolBuilder out) {
+        Plugin stripNativePlugin = stripNativePluginFactory.create();
+        if (stripNativePlugin != null) {
+            Map<String, String> stripNativeConfig = Map.<String, String>of(
+                                     STRIP_NATIVE_DEBUG_PLUGIN, OMIT_DEBUGINFO);
+            stripNativePlugin.configure(stripNativeConfig);
+            ResourcePoolManager outRes =
+                                 new ResourcePoolManager(in.byteOrder(),
+                                                        ((ResourcePoolImpl)in).getStringTable());
+            ResourcePool strippedJava = javaStripPlugin.transform(in,
+                                                                  outRes.resourcePoolBuilder());
+            return stripNativePlugin.transform(strippedJava, out);
+        } else {
         return javaStripPlugin.transform(in, out);
     }
+    }
+
+    public interface NativePluginFactory {
+        Plugin create();
+    }
+
+    private static class DefaultNativePluginFactory implements NativePluginFactory {
+
+        @Override
+        public Plugin create() {
+            return PluginRepository.getPlugin(STRIP_NATIVE_DEBUG_PLUGIN,
+                                              ModuleLayer.boot());
+        }
+
+    }
 
 }
< prev index next >