Domanda

Qualcuno ha compilato TCC su OS X?

Da quello che so che dovrebbe essere possibile, ma quando eseguo make ottengo il seguente errore:

$ make
gcc -o tcc tcc.c -DTCC_TARGET_I386 -O2 -g -Wall -fno-strict-aliasing -mpreferred-stack-                boundary=2 -march=i386 -falign-functions=0 -Wno-pointer-sign -Wno-sign-compare -D_FORTIFY_SOURCE=0 -lm -ldl
tcc.c:1: error: CPU you selected does not support x86-64 instruction set
tcc.c:1: error: CPU you selected does not support x86-64 instruction set
tcc.c:1: error: -mpreferred-stack-boundary=2 is not between 4 and 12
make: *** [tcc] Error 1

./configure funziona bene e dà il seguente output:

$ ./configure 
Binary  directory   /usr/local/bin
TinyCC directory    /usr/local/lib/tcc
Library directory   /usr/local/lib
Include directory   /usr/local/include
Manual directory    /usr/local/man
Doc directory       /usr/local/share/doc/tcc
Target root prefix  
Source path      /Users/aaron/Downloads/tcc-0.9.25
C compiler       gcc
CPU              x86
Big Endian       no
gprof enabled    no
cross compilers  no
use libgcc       no
Creating config.mak and config.h

Sono abbastanza sicuro che il problema è qualcosa di semplice, ma non ho compilato abbastanza programmi su OS X di essere a conoscenza del pratfalls ...

Lo scopo principale per l'installazione di TCC è stato quello di ottenere libtcc così ho potuto iniziare a sperimentare con la generazione dinamica di codice da Ruby (in caso che fa la differenza :-p)

Grazie!

È stato utile?

Soluzione

Io consolidare i miei commenti ora.

Sembra che ci siano diverse questioni.

  1. C'è stato un cambiamento nello schema di denominazione per l'accesso registro x86 come di Mac OS 10.5. Vedere accesso EIP e EBP via ucontext su OS X . Ciò richiederà l'hacking della sorgente fino a quando il manutentore può essere convinto a supportare Mac OS X.
  2. I formati eseguibili supportato da tcc non si sovrappongono con quelli che Mac OS X verrà eseguito in modo nativo. Tuttavia, XBinary possono affrontare questo. (Non ho trovato neanche un fink pacchetto o un pacchetto MacPorts , comunque e non ce l'ho installato ma non sono sicuro che lo farò -. questa è magia profonda, e potrebbe in teoria fare cose molto cattive davvero .) Ah ... questo era già su SO troppo: possibilita` di carico / l'esecuzione di file ELF su OSX
  3. .

Altri suggerimenti

Ho appena trascorso un certo tempo serio cercando di fare TCC girare su OSX. Ho incluso diverse correzioni, tra cui quello della risposta di cui sopra, e ora sono tutti nel repository sviluppo presso http://repo.or.cz/w/tinycc.git . Costruire, alcuni test e tutti gli esempi dovrebbe funzionare.

Non sono sicuro se si è consapevoli, ma il sito http://bellard.org/tcc/ che appartiene a Fabrice Bellard che ha iniziato questo progetto, non viene aggiornato regolarmente. Soprattutto perché non ci sono molte versioni 'ufficiali' TCC. TCC è uno di quei progetti che vive per lo più fuori di sorgenti live e aggiornamenti. Quindi, se si vuole dare a questo un altro tentativo, visita la pagina http://repo.or.cz/ w / tinycc.git e ottenere il ramo 'mafia' (non 'master'). Si prega di consultare http://repo.or.cz/w/tinycc.git per i dettagli , e non iscriversi alla mailing list per essere coinvolti.

Gli errori può essere risolto modificare script di configurazione del pacchetto di TCC (ver 0.9.25).

Nel script di configurazione, linea 36 dice cpu = uname -m Se si esegue uname -m nella console di Mac OS X, viene stampato "i386", anche se si tratta di un sistema a 64 bit.

Una soluzione è quella di commentare fuori questa linea, e sostituirlo con cpu = x86_64,

Poi alcuni errori compilando apparirà a causa delle convenzioni registro di denominazione in Mac OS X, come detto da dmckee in questo thread.

La mia soluzione è quella di aggiungere alcune righe a libtcc.c attorno alla riga 1512. Infine, sarà simile a

#ifdef __DARWIN_UNIX03
        *paddr = uc->uc_mcontext->__ss.__rip;
#else
        *paddr = uc->uc_mcontext.gregs[REG_RIP];
#endif
        return 0;
    } else {
#ifdef __DARWIN_UNIX03
        fp = uc->uc_mcontext->__ss.__rbp;
#else
        fp = uc->uc_mcontext.gregs[REG_RBP];
#endif

Si compila poi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top