Als ich versuchte, mit dem Compiler mit "Let's make a normal compiler" zu beginnen, konnte ich Hello World nicht einmal in einer 64-Bit-Umgebung verschieben, daher war es ein Memo der Korrekturen. Darüber hinaus wird der Patch unten veröffentlicht. Nutzen Sie ihn daher bitte. kamaboko123/cbc-64bit-patch
Es gibt zwei Hauptkorrekturen.
Die Umgebung ist Ubuntu 16.04 + OpenJDK9. (Wir haben den Betrieb in anderen Umgebungen nicht bestätigt.)
Ändern Sie net / lovuby / cflat / parser / Parser.jj
.
cbcs net.loveruby.cflat.entity.Parameter
ist
Es steht in Konflikt mit java.lang.reflect.Parameter
, das seit Java8 in der Standardbibliothek eingeführt worden zu sein scheint.
Ändern Sie einfach das Teil mit der Aufschrift "Parameter" so, dass es einen vollständigen Namen hat.
Wenn es problematisch ist, ist dies eine Zeile.
sed "s/Parameter/net.loveruby.cflat.entity.Parameter/g" net/loveruby/cflat/parser/Parser.jj > net/loveruby/cflat/parser/Parser.jj.tmp; mv net/loveruby/cflat/parser/Parser.jj.tmp net/loveruby/cflat/parser/Parser.jj;
Fügen Sie eine Option zwischen der 19. und 20. Zeile von "net / lovububy / cflat / sysdep / GNUAssembler.java" hinzu.
public void assemble(String srcPath, String destPath,
AssemblerOptions opts) throws IPCException {
List<String> cmd = new ArrayList<String>();
cmd.add("as");
cmd.add("--32"); //Option für 32-Bit-Ziel hinzugefügt
cmd.addAll(opts.args);
cmd.add("-o");
cmd.add(destPath);
cmd.add(srcPath);
CommandUtils.invoke(cmd, errorHandler, opts.verbose);
}
Nicht nur der Assembler, sondern auch der Linker müssen explizit angeben, ob 32-Bit-Ziele erreicht werden sollen.
Die Korrekturen befinden sich in den Zeilen 29-30 und 59-60 von "net / lovububy / cflat / sysdep / GNULinker.java".
In der Nähe der Linien 29-30
public void generateExecutable(List<String> args,
String destPath, LinkerOptions opts) throws IPCException {
List<String> cmd = new ArrayList<String>();
cmd.add(LINKER);
cmd.add("-melf_i386"); //hinzufügen
cmd.add("-dynamic-linker");
cmd.add(DYNAMIC_LINKER);
if (opts.generatingPIE) {
cmd.add("-pie");
}
if (! opts.noStartFiles) {
cmd.add(opts.generatingPIE
? C_RUNTIME_START_PIE
: C_RUNTIME_START);
cmd.add(C_RUNTIME_INIT);
}
cmd.addAll(args);
if (! opts.noDefaultLibs) {
cmd.add("-lc");
cmd.add("-lcbc");
}
if (! opts.noStartFiles) {
cmd.add(C_RUNTIME_FINI);
}
cmd.add("-o");
cmd.add(destPath);
CommandUtils.invoke(cmd, errorHandler, opts.verbose);
}
In der Nähe der Linien 59-60
public void generateSharedLibrary(List<String> args,
String destPath, LinkerOptions opts) throws IPCException {
List<String> cmd = new ArrayList<String>();
cmd.add(LINKER);
cmd.add("-melf_i386"); //hinzufügen
cmd.add("-shared");
if (! opts.noStartFiles) {
cmd.add(C_RUNTIME_INIT);
}
cmd.addAll(args);
if (! opts.noDefaultLibs) {
cmd.add("-lc");
cmd.add("-lcbc");
}
if (! opts.noStartFiles) {
cmd.add(C_RUNTIME_FINI);
}
cmd.add("-o");
cmd.add(destPath);
CommandUtils.invoke(cmd, errorHandler, opts.verbose);
}
In einigen Umgebungen müssen Sie möglicherweise auch den Laufzeitpfad (Startroutine?) Ändern.
In Ubuntu16.04 existiert die C-Laufzeit nicht in / usr / lib
, sondern in / usr / lib32
.
Es gibt eine Möglichkeit, dies durch Erstellen eines symbolischen Links zu lösen, aber ich denke, es ist besser, sich mit der Quellcodeseite zu beschäftigen, da nur die folgenden 4 Zeilen geheilt werden.
Zeilen 12-16 von net / lovububy / cflat / sysdep / GNULinker.java
.
//Vor der Korrektur
//static final private String C_RUNTIME_INIT = "/usr/lib/crti.o";
//static final private String C_RUNTIME_START = "/usr/lib/crt1.o";
//static final private String C_RUNTIME_START_PIE = "/usr/lib/Scrt1.o";
//static final private String C_RUNTIME_FINI = "/usr/lib/crtn.o";
//Überarbeitet
static final private String C_RUNTIME_INIT = "/usr/lib32/crti.o";
static final private String C_RUNTIME_START = "/usr/lib32/crt1.o";
static final private String C_RUNTIME_START_PIE = "/usr/lib32/Scrt1.o";
static final private String C_RUNTIME_FINI = "/usr/lib32/crtn.o";
Es ist diff.
diff --git a/net/loveruby/cflat/parser/Parser.jj b/net/loveruby/cflat/parser/Parser.jj
index f6811b3..a73904a 100644
--- a/net/loveruby/cflat/parser/Parser.jj
+++ b/net/loveruby/cflat/parser/Parser.jj
@@ -567,7 +567,7 @@ Params params():
LOOKAHEAD(<VOID> ")")
t=<VOID>
{
- return new Params(location(t), new ArrayList<Parameter>());
+ return new Params(location(t), new ArrayList<net.loveruby.cflat.entity.Parameter>());
}
| params=fixedparams()
["," "..." { params.acceptVarargs(); }]
@@ -580,8 +580,8 @@ Params params():
// #@@range/fixedparams{
Params fixedparams():
{
- List<Parameter> params = new ArrayList<Parameter>();
- Parameter param, param1;
+ List<net.loveruby.cflat.entity.Parameter> params = new ArrayList<net.loveruby.cflat.entity.Parameter>();
+ net.loveruby.cflat.entity.Parameter param, param1;
}
{
param1=param() { params.add(param1); }
@@ -593,13 +593,13 @@ Params fixedparams():
// #@@}
// #@@range/param{
-Parameter param():
+net.loveruby.cflat.entity.Parameter param():
{
TypeNode t;
String n;
}
{
- t=type() n=name() { return new Parameter(t, n); }
+ t=type() n=name() { return new net.loveruby.cflat.entity.Parameter(t, n); }
}
// #@@}
diff --git a/net/loveruby/cflat/sysdep/GNUAssembler.java b/net/loveruby/cflat/sysdep/GNUAssembler.java
index 42a5a33..b95275b 100644
--- a/net/loveruby/cflat/sysdep/GNUAssembler.java
+++ b/net/loveruby/cflat/sysdep/GNUAssembler.java
@@ -17,6 +17,7 @@ class GNUAssembler implements Assembler {
AssemblerOptions opts) throws IPCException {
List<String> cmd = new ArrayList<String>();
cmd.add("as");
+ cmd.add("--32");
cmd.addAll(opts.args);
cmd.add("-o");
cmd.add(destPath);
diff --git a/net/loveruby/cflat/sysdep/GNULinker.java b/net/loveruby/cflat/sysdep/GNULinker.java
index 0487d6b..a5620aa 100644
--- a/net/loveruby/cflat/sysdep/GNULinker.java
+++ b/net/loveruby/cflat/sysdep/GNULinker.java
@@ -10,10 +10,10 @@ class GNULinker implements Linker {
// #@@range/vars{
static final private String LINKER = "/usr/bin/ld";
static final private String DYNAMIC_LINKER = "/lib/ld-linux.so.2";
- static final private String C_RUNTIME_INIT = "/usr/lib/crti.o";
- static final private String C_RUNTIME_START = "/usr/lib/crt1.o";
- static final private String C_RUNTIME_START_PIE = "/usr/lib/Scrt1.o";
- static final private String C_RUNTIME_FINI = "/usr/lib/crtn.o";
+ static final private String C_RUNTIME_INIT = "/usr/lib32/crti.o";
+ static final private String C_RUNTIME_START = "/usr/lib32/crt1.o";
+ static final private String C_RUNTIME_START_PIE = "/usr/lib32/Scrt1.o";
+ static final private String C_RUNTIME_FINI = "/usr/lib32/crtn.o";
// #@@}
ErrorHandler errorHandler;
@@ -27,6 +27,7 @@ class GNULinker implements Linker {
String destPath, LinkerOptions opts) throws IPCException {
List<String> cmd = new ArrayList<String>();
cmd.add(LINKER);
+ cmd.add("-melf_i386");
cmd.add("-dynamic-linker");
cmd.add(DYNAMIC_LINKER);
if (opts.generatingPIE) {
@@ -57,6 +58,7 @@ class GNULinker implements Linker {
String destPath, LinkerOptions opts) throws IPCException {
List<String> cmd = new ArrayList<String>();
cmd.add(LINKER);
+ cmd.add("-melf_i386");
cmd.add("-shared");
if (! opts.noStartFiles) {
cmd.add(C_RUNTIME_INIT);
Recommended Posts