[LINUX] Führen Sie cbc von "Let's make a normal compiler" mit Java 8 oder höher + 64bit aus

Führen Sie cbc in einer 64-Bit-Umgebung aus

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.)

Unterstützt Java 8 oder höher

Beheben Sie Konflikte mit Parameterklassen

Ä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;

Generieren Sie eine Binärdatei für 32-Bit in einer 64-Bit-Umgebung

Ändern Sie die Optionen für den Ziel-Assembler auf 32 Bit

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);
}

Ändern Sie die Optionen, um den Linker auf 32 Bit auszurichten

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";

Liste der Korrekturen

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

Führen Sie cbc von "Let's make a normal compiler" mit Java 8 oder höher + 64bit aus
Lassen Sie uns eine GUI mit Python erstellen.
Machen wir einen Blockbruch mit wxPython
Machen wir mit xCAT einen Spacon
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Lassen Sie uns mit Python langsam sprechen
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Erstellen Sie ein Webframework mit Python! (1)
Machen wir mit Pylearn 2 eine dreiäugige KI
Lassen Sie uns das Bash-Skript in Java ausführen
Machen wir einen Twitter-Bot mit Python!
Erstellen Sie ein Webframework mit Python! (2)
Machen wir eine nervenschwächende App mit Vue.js und Django-Rest-Framework [Teil 3] ~ Implementierung von Nervenschwäche ~
[Lass uns mit Python spielen] Ein Haushaltsbuch erstellen
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Lassen Sie uns das Abhängigkeitsmanagement mit pip etwas einfacher machen
Lassen Sie uns eine Mac-App mit Tkinter und py2app erstellen
Versuchen Sie, mit Rhinoceros / Grasshopper / GHPython ein sphärisches Gitter zu erstellen
[Super einfach] Machen wir einen LINE BOT mit Python.
Lassen Sie uns ein Cron-Programm in Java erstellen! !! (TaskScheduler)
Lassen Sie uns mit Python einen Web-Socket-Client erstellen. (Zugriffstoken-Authentifizierung)
Lassen Sie uns ein Diagramm erstellen, auf das mit IPython geklickt werden kann