void createResourceObject(String name) throws IOException, InterruptedException { ProcessBuilder pb = files.getProcessBuilder().directory(files.resolveTemp(".")); pb.command("ld","-r","-b","binary","-o",name+".o",name); // writes to <name>.o. Symbols are always based on name. Process p = pb.redirectError(files.resolveTemp("ld-"+name+".err")) .redirectOutput(files.resolveTemp("ld-"+name+".out")) .start(); int exit = p.waitFor(); if (exit != 0) { System.err.println(files.loadFromTemp("ld-"+name+".err")); throw KEMException.criticalError("Failed to embed resource into object file. See output for error information."); } }
/** Must be kept compatible with {@link .compileOcamlObject} and consistent with {@link .compileOcaml}. */ void linkOcamlObject(String compiler, String name, String target, String... objectFiles) throws IOException, InterruptedException { // now link ProcessBuilder pb = files.getProcessBuilder(); List<String> args = new ArrayList<>(Arrays.asList( compiler, name, "-o", target, "-Wl,-E")); args.addAll(Arrays.asList(objectFiles)); args.addAll(Arrays.asList("-lmpfr","-lgmp","-lffi","-lm","-ldl")); args.add("-Wl,--no-as-needed"); args.addAll(options.experimental.nativeLibraries); pb.command(args); if (options.global.verbose) { System.err.println("+ " + StringUtils.join(args, " ")); } Process p = pb.redirectError(files.resolveTemp("link.err")) .redirectOutput(files.resolveTemp("link.out")) .start(); int exit = p.waitFor(); if (exit != 0) { System.err.println(files.loadFromTemp("link.err")); throw KEMException.criticalError("Failed to link final program. See output for error information."); } }
int exit = p.waitFor(); if (exit != 0) { System.err.println(files.loadFromTemp("compile.err")); throw KEMException.criticalError("Failed to compile program to ocaml. See output for error information.");