mirror of https://github.com/aamine/cbc
* net/loveruby/cflat/compiler/Compiler.java: implement -shared.
* net/loveruby/cflat/compiler/Options.java: new option -shared. * net/loveruby/cflat/compiler/CodeGeneratorOptions.java: ditto. * net/loveruby/cflat/compiler/SourceFile.java: new method #linkedFileName. git-svn-id: file:///Users/aamine/c/gitwork/public/cbc/trunk@4065 1b9489fe-b721-0410-924e-b54b9192deb8
This commit is contained in:
parent
94db94b1c4
commit
1d35dd1665
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
Sun Sep 28 07:06:37 2008 Minero Aoki <aamine@loveruby.net>
|
||||
|
||||
* net/loveruby/cflat/compiler/Compiler.java: implement -shared.
|
||||
|
||||
* net/loveruby/cflat/compiler/Options.java: new option -shared.
|
||||
|
||||
* net/loveruby/cflat/compiler/CodeGeneratorOptions.java: ditto.
|
||||
|
||||
* net/loveruby/cflat/compiler/SourceFile.java: new method
|
||||
#linkedFileName.
|
||||
|
||||
Sun Sep 28 05:07:30 2008 Minero Aoki <aamine@loveruby.net>
|
||||
|
||||
* implement PIC generation.
|
||||
|
|
4
ToDo
4
ToDo
|
@ -7,10 +7,9 @@
|
|||
* Label -> Symbol
|
||||
* all Symbols should be got from objects
|
||||
* named/unnamed Label
|
||||
* -shared
|
||||
* bin/cbc: resolve symbolic link
|
||||
* remove all FIXME
|
||||
? -fPIE, -pie
|
||||
* -fPIE, -pie
|
||||
|
||||
== Done
|
||||
|
||||
|
@ -252,3 +251,4 @@
|
|||
- -O (jump elimination)
|
||||
- useless label elimination
|
||||
- -fPIC (PIC generation)
|
||||
- -shared
|
||||
|
|
|
@ -5,11 +5,13 @@ import java.util.*;
|
|||
class CodeGeneratorOptions {
|
||||
protected int optimizeLevel;
|
||||
protected boolean generatePIC;
|
||||
protected boolean generatePIE;
|
||||
protected boolean verboseAsm;
|
||||
|
||||
public CodeGeneratorOptions() {
|
||||
optimizeLevel = 0;
|
||||
generatePIC = false;
|
||||
generatePIE = false;
|
||||
verboseAsm = false;
|
||||
}
|
||||
|
||||
|
@ -38,6 +40,10 @@ class CodeGeneratorOptions {
|
|||
return verboseAsm;
|
||||
}
|
||||
|
||||
public boolean isPositionIndependent() {
|
||||
return generatePIC || generatePIE;
|
||||
}
|
||||
|
||||
public void generatePIC() {
|
||||
this.generatePIC = true;
|
||||
}
|
||||
|
@ -45,4 +51,12 @@ class CodeGeneratorOptions {
|
|||
public boolean isPICRequired() {
|
||||
return generatePIC;
|
||||
}
|
||||
|
||||
public void generatePIE() {
|
||||
this.generatePIE = true;
|
||||
}
|
||||
|
||||
public boolean isPIERequired() {
|
||||
return generatePIE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,7 +59,12 @@ public class Compiler {
|
|||
compileFile(src, opts);
|
||||
}
|
||||
if (! opts.isLinkRequired()) System.exit(0);
|
||||
if (! opts.isGeneratingSharedLibrary()) {
|
||||
generateExecutable(opts);
|
||||
}
|
||||
else {
|
||||
generateSharedLibrary(opts);
|
||||
}
|
||||
System.exit(0);
|
||||
}
|
||||
catch (CompileException ex) {
|
||||
|
@ -201,15 +206,25 @@ public class Compiler {
|
|||
invoke(cmd, opts.isVerboseMode());
|
||||
}
|
||||
|
||||
static final protected String DYNAMIC_LINKER = "/lib/ld-linux.so.2";
|
||||
static final protected String C_RUNTIME_INIT = "/usr/lib/crti.o";
|
||||
static final protected String C_RUNTIME_START = "/usr/lib/crt1.o";
|
||||
static final protected String C_RUNTIME_START_PIE = "/usr/lib/Scrt1.o";
|
||||
static final protected String C_RUNTIME_FINI = "/usr/lib/crtn.o";
|
||||
|
||||
protected void generateExecutable(Options opts) throws IPCException {
|
||||
List cmd = new ArrayList();
|
||||
cmd.add("ld");
|
||||
// FIXME: -dynamic-linker required only on dynamic linking
|
||||
cmd.add("-dynamic-linker");
|
||||
cmd.add("/lib/ld-linux.so.2");
|
||||
cmd.add(DYNAMIC_LINKER);
|
||||
if (opts.isGeneratingPIE()) {
|
||||
cmd.add("-pie");
|
||||
}
|
||||
if (! opts.noStartFiles()) {
|
||||
cmd.add("/usr/lib/crt1.o");
|
||||
cmd.add("/usr/lib/crti.o");
|
||||
cmd.add(opts.isGeneratingPIE()
|
||||
? C_RUNTIME_START_PIE
|
||||
: C_RUNTIME_START);
|
||||
cmd.add(C_RUNTIME_INIT);
|
||||
}
|
||||
cmd.addAll(opts.ldArgs());
|
||||
if (! opts.noDefaultLibs()) {
|
||||
|
@ -217,13 +232,33 @@ public class Compiler {
|
|||
cmd.add("-lcbc");
|
||||
}
|
||||
if (! opts.noStartFiles()) {
|
||||
cmd.add("/usr/lib/crtn.o");
|
||||
cmd.add(C_RUNTIME_FINI);
|
||||
}
|
||||
cmd.add("-o");
|
||||
cmd.add(opts.exeFileName());
|
||||
invoke(cmd, opts.isVerboseMode());
|
||||
}
|
||||
|
||||
protected void generateSharedLibrary(Options opts) throws IPCException {
|
||||
List cmd = new ArrayList();
|
||||
cmd.add("ld");
|
||||
cmd.add("-shared");
|
||||
if (! opts.noStartFiles()) {
|
||||
cmd.add(C_RUNTIME_INIT);
|
||||
}
|
||||
cmd.addAll(opts.ldArgs());
|
||||
if (! opts.noDefaultLibs()) {
|
||||
cmd.add("-lc");
|
||||
cmd.add("-lcbc");
|
||||
}
|
||||
if (! opts.noStartFiles()) {
|
||||
cmd.add(C_RUNTIME_FINI);
|
||||
}
|
||||
cmd.add("-o");
|
||||
cmd.add(opts.soFileName());
|
||||
invoke(cmd, opts.isVerboseMode());
|
||||
}
|
||||
|
||||
protected void invoke(List cmdArgs, boolean debug) throws IPCException {
|
||||
if (debug) {
|
||||
dumpCommand(cmdArgs.iterator());
|
||||
|
|
|
@ -15,6 +15,8 @@ class Options {
|
|||
protected boolean debugParser;
|
||||
protected CodeGeneratorOptions genOptions;
|
||||
protected List asOptions; // List<String>
|
||||
protected boolean generatingSharedLibrary;
|
||||
protected boolean generatingPIE;
|
||||
protected List ldArgs; // List<LdArg>
|
||||
protected boolean noStartFiles = false;
|
||||
protected boolean noDefaultLibs = false;
|
||||
|
@ -24,6 +26,8 @@ class Options {
|
|||
this.loader = loader;
|
||||
this.genOptions = new CodeGeneratorOptions();
|
||||
this.asOptions = new ArrayList();
|
||||
this.generatingSharedLibrary = false;
|
||||
this.generatingPIE = false;
|
||||
this.ldArgs = new ArrayList();
|
||||
}
|
||||
|
||||
|
@ -71,11 +75,18 @@ class Options {
|
|||
}
|
||||
|
||||
public String exeFileName() {
|
||||
if (outputFileName != null) return outputFileName;
|
||||
return getOutputFileName("");
|
||||
}
|
||||
|
||||
public String soFileName() {
|
||||
return getOutputFileName(".so");
|
||||
}
|
||||
|
||||
protected String getOutputFileName(String newExt) {
|
||||
List srcs = sourceFiles();
|
||||
if (srcs.size() == 1) {
|
||||
SourceFile src = (SourceFile)srcs.get(0);
|
||||
return src.exeFileName(this);
|
||||
return src.linkedFileName(this, newExt);
|
||||
}
|
||||
else {
|
||||
return "a.out";
|
||||
|
@ -123,6 +134,10 @@ class Options {
|
|||
return this.asOptions;
|
||||
}
|
||||
|
||||
public boolean isGeneratingSharedLibrary() {
|
||||
return this.generatingSharedLibrary;
|
||||
}
|
||||
|
||||
// List<ldArg>
|
||||
public List ldArgs() {
|
||||
return this.ldArgs;
|
||||
|
@ -171,15 +186,14 @@ class Options {
|
|||
else if (arg.startsWith("-o")) {
|
||||
outputFileName = getOptArg(arg, args);
|
||||
}
|
||||
else if (arg.equals("-fpic")) {
|
||||
else if (arg.equals("-fpic")
|
||||
|| arg.equals("-fPIC")) {
|
||||
genOptions.generatePIC();
|
||||
}
|
||||
else if (arg.equals("-fPIC")) {
|
||||
genOptions.generatePIC();
|
||||
else if (arg.equals("-fpie")
|
||||
|| arg.equals("-fPIE")) {
|
||||
genOptions.generatePIE();
|
||||
}
|
||||
// FIXME: PIE
|
||||
//else if (arg.equals("-fpie"))
|
||||
//else if (arg.equals("-fPIE"))
|
||||
else if (arg.startsWith("-O")) {
|
||||
String type = arg.substring(2);
|
||||
if (! type.matches("^([0123s]|)$")) {
|
||||
|
@ -200,10 +214,11 @@ class Options {
|
|||
ldArgs.add(new LdOption(arg));
|
||||
}
|
||||
else if (arg.equals("-shared")) {
|
||||
// FIXME: ?? any more work is required??
|
||||
ldArgs.add(new LdOption(arg));
|
||||
generatingSharedLibrary = true;
|
||||
}
|
||||
else if (arg.equals("-pie")) {
|
||||
generatingPIE = true;
|
||||
}
|
||||
//else if (arg.equals("-pie"))
|
||||
else if (arg.startsWith("-L")) {
|
||||
ldArgs.add(new LdOption("-L" + getOptArg(arg, args)));
|
||||
}
|
||||
|
@ -338,7 +353,7 @@ class Options {
|
|||
out.println(" -Os Equivalent to -O.");
|
||||
out.println(" -O0 Disables optimization (default).");
|
||||
out.println(" -fPIC Generates PIC assembly.");
|
||||
//out.println(" -fPIE Generates PIE assembly.");
|
||||
out.println(" -fPIE Generates PIE assembly.");
|
||||
out.println(" --verbose-asm Generate assembly with verbose comments.");
|
||||
out.println("");
|
||||
out.println("Assembler Options:");
|
||||
|
@ -350,7 +365,7 @@ class Options {
|
|||
out.println(" -L PATH Adds PATH as library directory.");
|
||||
out.println(" -shared Generates shared library rather than executable.");
|
||||
out.println(" -static Linkes only with static libraries.");
|
||||
//out.println(" -pie Generates PIE.");
|
||||
out.println(" -pie Generates PIE.");
|
||||
out.println(" -nostartfiles Do not link startup files.");
|
||||
out.println(" -nodefaultlibs Do not link default libraries.");
|
||||
out.println(" -nostdlib Enables -nostartfiles and -nodefaultlibs.");
|
||||
|
|
|
@ -59,8 +59,8 @@ class SourceFile implements LdArg {
|
|||
return or(opts.outputFileNameFor("-c"), replaceExt(".o"));
|
||||
}
|
||||
|
||||
public String exeFileName(Options opts) {
|
||||
return or(opts.outputFileName, replaceExt(""));
|
||||
public String linkedFileName(Options opts, String newExt) {
|
||||
return or(opts.outputFileName, replaceExt(newExt));
|
||||
}
|
||||
|
||||
protected String or(String x, String y) {
|
||||
|
|
Loading…
Reference in New Issue