RFR: 8214796: Create a jlink plugin for stripping debug info symbols from native libraries
Mandy Chung
mandy.chung at oracle.com
Tue Feb 26 21:35:30 UTC 2019
Hi Severin,
This is my initial set of comments.
On 2/26/19 3:01 AM, Severin Gehwolf wrote:
> --list-plugins output for --strip-native-debug-symbols:
>
> Plugin Name: strip-native-debug-symbols
> Option: --strip-native-debug-symbols=<exclude-debuginfo-files|keep-debuginfo-files>
> Description: Strip debug symbols from native libraries (if any).
> This plugin requires at least one option:
> objcopy: The path to the objcopy binary. Defaults to objcopy in PATH.
> exclude-debuginfo-files: Omit debug info files. Defaults to true.
s/Omit/Exclude/
> keep-debuginfo-files[=<ext>]: Keep debug info files in <file>.<ext>.
> Defaults to <file>.debuginfo
> Examples: --strip-native-debug-symbols objcopy=/usr/bin/objcopy
This is a little awkward that this defaults to exclude-debuginfo-files.
As described above, I would expect "exclude-debuginfo-files" or
"keep-debuginfo-files" must be specified. It means that the command
would be:
--strip-native-debug-symbols
exclude-debuginfo-files:objcopy=/usr/bin/objcopy
> --strip-native-debug-symbols=exclude-debuginfo-files
> --strip-native-debug-symbols keep-debuginfo-files:objcopy=objcopy
>
What is the expected behavior when jlink --strip-debug
--strip-native-debug-symbols keep-debuginfo-files is specified? Should
it be accepted? This should be specified in the CSR.
> Latest webrev which implements this:
> http://cr.openjdk.java.net/~sgehwolf/webrevs/JDK-8214796/08/webrev/
>
DefaultStripDebugPlugin.java
I still think that conceptually it's more straight-forward to treat
--strip-debug option to imply as if --strip-java-debug-attributes and
--strip-native-debug-symbols option, if available and not specified,
were specified on the command line. These plugins will be invoked
accordingly rather than an explicit invocation of these 2 plugins. But
we don't have such precedence to follow. W.r.t. your current
implementation:
I think this can be simplfied to keep Optional<Plugin> field and replace
DefaultNativePluginFactory and NativePluginFactory with a simple static
method to return Optional.ofNullable(...).
47 private static final String OMIT_DEBUGINFO =
"exclude-debuginfo-files";
Nit: rename OMIT_ to EXCLUDE_ to match the name
77 Map<String, String> stripNativeConfig = Map.<String,
String>of(
drop the diamond operation.
StripNativeDebugSymbolsPlugin.java
56 public static final String NAME = "strip-native-debug-symbols";
Does this need to be public? Should it be private static field?
101 if (resource.type() ==
ResourcePoolEntry.Type.NATIVE_LIB ||
102 resource.type() ==
ResourcePoolEntry.Type.NATIVE_CMD) {
103 String moduleName = resource.moduleName();
104 if (resource.path().endsWith(SHARED_LIBS_EXT) ||
105 resource.path().startsWith("/" + moduleName +
"/bin")) {
Alternatively:
if ((resource.type() == ResourcePoolEntry.Type.NATIVE_LIB
&& resource.path().endsWith(SHARED_LIBS_EXT)) ||
resource.type() == ResourcePoolEntry.Type.NATIVE_CMD)
If --strip-native-commands is specified, this may want to skip
processing NATIVE_CMD? Alternatively it should ensure
-strip-native-commands is invoked before --strip-native-debug-symbols;
otherwise, debuginfo files might have left behind if
keep-debuginfo-files is specified while the native commands are stripped
later.
doConfigure compares if arg matches one of the expected argument names.
I think it does not report if any invalid argument?
Looks like it also accepts
--strip-native-debug-symbols=exclude-debuginfo-files=abc:keep-debuginfo-files=cde.
This might be a jlink plugin parsing bug?
createDebugSymbolsFile, addGnuDebugLink and stripBinary
- if the command fails, should the plugin fail instead? you currently
silently ignore any error.
ObjCopyCmdBuilder.build(String objCopy) can be changed to
ObjCopyCmdBuilder.build(String objCopy, String... opts) to build the
entire command line in one go.
Nit: StrippedDebugInfoBinary can be made immutable. It might be cleaner
to refactor the createDebugSymbolsFile, addGnuDebugLink and stripBinary
methods in a builder class to build a StrippedDebugInfoBinary for a
given ResourcePoolEntry.
I suggest to place the tests under
test/jdk/tools/jlink/plugins/StripNativeDebugSymbolsPlugin/ which I
think jlink tests are organized with plugin class name rather than
plugin option name.
Mandy
More information about the jigsaw-dev
mailing list