@Override public Path write(DebugContext debug, Path outputDirectory, Path tempDirectory, String imageName, BeforeImageWriteAccessImpl config) { Path imagePath = super.write(debug, outputDirectory, tempDirectory, imageName, config); writeHeaderFiles(outputDirectory, imageName, false); writeHeaderFiles(outputDirectory, imageName, true); return imagePath; } }
write(tempFile); try { Files.copy(tempFile, tempDirectory.resolve(imageName + ObjectFile.getFilenameSuffix())); write(tempDirectory.resolve(imageName + ObjectFile.getFilenameSuffix())); LinkerInvocation inv = getLinkerInvocation(outputDirectory, tempDirectory, imageName); for (Function<LinkerInvocation, LinkerInvocation> fn : config.getLinkerInvocationTransformers()) { inv = fn.apply(inv);
Path outputFile = outputDirectory.resolve(imageName + getBootImageKind().getFilenameSuffix()); UserError.guarantee(!Files.isDirectory(outputFile), "Cannot write image to %s. Path exists as directory. (Use -H:Name=<image name>)", outputFile); inv.setOutputFile(outputFile); inv.setOutputKind(getOutputKind());
@Override LinkerInvocation getLinkerInvocation(Path outputDirectory, Path tempDirectory, String imageName) { String mainSymbolNameStem = NativeBootImage.globalSymbolNameForMethod(mainEntryPoint); // HACK: guess main symbol name using hacked-up knowledge of object file format String mainSymbolAlias = (ObjectFile.getNativeFormat() == ObjectFile.Format.MACH_O) ? "_main" : "main"; String mainSymbolName = (ObjectFile.getNativeFormat() == ObjectFile.Format.MACH_O) ? "_" + mainSymbolNameStem : mainSymbolNameStem; LinkerInvocation inv = super.getLinkerInvocation(outputDirectory, tempDirectory, imageName); inv.addSymbolAlias(mainSymbolAlias, mainSymbolName); return inv; } }