Exécutez cbc de "Faisons un compilateur normal" avec Java 8 ou version ultérieure + 64 bits

Exécutez cbc dans un environnement 64 bits

Quand j'ai essayé de démarrer avec le compilateur avec "Faisons un compilateur normal", je ne pouvais même pas déplacer Hello World dans un environnement 64 bits, donc c'était un mémo des corrections. De plus, le correctif est publié ci-dessous, alors veuillez en profiter. kamaboko123/cbc-64bit-patch

Il y a deux corrections principales.

L'environnement est Ubuntu 16.04 + OpenJDK9. (Nous n'avons pas confirmé l'opération dans d'autres environnements)

Prend en charge Java 8 ou version ultérieure

Correction des conflits de classe de paramètres

Modifiez net / loveruby / cflat / parser / Parser.jj. net.loveruby.cflat.entity.Parameter de cbc est Il entre en conflit avec java.lang.reflect.Parameter, qui semble avoir été introduit dans la bibliothèque standard depuis Java8. Modifiez simplement la partie qui dit «Paramètre» pour qu'elle ait un nom complet.

Si c'est gênant, c'est une ligne.

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;

Générer un binaire pour 32 bits dans un environnement 64 bits

Modifier les options de l'assembleur cible en 32 bits

Ajoutez une option entre les 19e et 20e lignes de net / loveruby / cflat / sysdep / GNUAssembler.java.

public void assemble(String srcPath, String destPath,
                        AssemblerOptions opts) throws IPCException {
    List<String> cmd = new ArrayList<String>();
    cmd.add("as");
    cmd.add("--32");    //Ajout d'une option pour cibler 32 bits
    cmd.addAll(opts.args);
    cmd.add("-o");
    cmd.add(destPath);
    cmd.add(srcPath);
    CommandUtils.invoke(cmd, errorHandler, opts.verbose);
}

Modifiez l'option pour cibler l'éditeur de liens sur 32 bits

Non seulement l'assembleur, mais aussi l'éditeur de liens doit spécifier explicitement pour cibler 32 bits.

Les corrections sont sur les lignes 29-30 et 59-60 de net / loveruby / cflat / sysdep / GNULinker.java.

Près des lignes 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");   //ajouter à
    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);
}

Près des lignes 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");    //ajouter à
    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);
}

Vous devrez peut-être également modifier le chemin d'exécution (routine de démarrage?) Dans certains environnements. Dans Ubuntu16.04, le runtime C n'existe pas dans / usr / lib, il existe dans / usr / lib32. Il existe un moyen de le résoudre en créant un lien symbolique, mais je pense qu'il vaut mieux jouer avec le côté code source car il ne guérit que les 4 lignes suivantes.

Lignes 12-16 de net / loveruby / cflat / sysdep / GNULinker.java.

//Avant correction
//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";

//modifié
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 des corrections

C'est 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

Exécutez cbc de "Faisons un compilateur normal" avec Java 8 ou version ultérieure + 64 bits
Faisons une interface graphique avec python.
Faisons une rupture de bloc avec wxPython
Faisons un spacon avec xCAT
Faisons un jeu de shiritori avec Python
Faisons la voix lentement avec Python
Faisons un langage simple avec PLY 1
Créez un framework Web avec Python! (1)
Faisons une IA à trois yeux avec Pylearn 2
Lançons le script Bash en Java
Faisons un bot Twitter avec Python!
Créez un framework Web avec Python! (2)
Faisons une application qui affaiblit les nerfs avec Vue.js et Django-Rest-Framework [Partie 3] ~ Implémentation de la faiblesse nerveuse ~
[Jouons avec Python] Créer un livre de comptes de ménage
Essayez de créer un jeu simple avec Python 3 et iPhone
Facilitons un peu la gestion des dépendances avec pip
Créons une application Mac avec Tkinter et py2app
Essayez de créer une grille sphérique avec Rhinoceros / Grasshopper / GHPython
[Super facile] Faisons un LINE BOT avec Python.
Faisons un programme cron en Java! !! (Planificateur de tâches)
Créons un client de socket Web avec Python. (Authentification par jeton d'accès)
Faisons un diagramme sur lequel on peut cliquer avec IPython