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