Pregunta

¿Alguien ha compilado correctamente TCC en OS X?

Por lo que sé que debería ser posible, pero cuando corro hago me sale el siguiente error:

$ 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 funciona muy bien y da el siguiente resultado:

$ ./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

Estoy bastante seguro de que el tema es algo sencillo, pero no he recopilado suficientes programas en OS X para estar al tanto de la pratfalls ...

El propósito principal para la instalación de TCC era conseguir libtcc para que pudiera empezar a experimentar con la generación dinámica de código de Ruby (en caso de que hace una diferencia :-p)

Gracias!

¿Fue útil?

Solución

Voy a consolidar mis comentarios ahora.

Parece que hay varios problemas.

  1. Se ha producido un cambio en el esquema de nomenclatura para el acceso a registro x86 como de Mac OS 10.5. Ver acceso EIP y EBP través ucontext en OS X . Para ello será necesario cortar la fuente hasta que el desarrollador puede ser convencido para apoyar Mac OS X.
  2. Los formatos ejecutables apoyado por tcc no se superponen con los que Mac OS X se ejecutará de forma nativa. Sin embargo, XBinary puede abordar esta cuestión. (No he encontrado bien un Fink paquete o una paquete DarwinPorts , sin embargo, no lo tiene instalado todavía no estoy seguro de que lo haré -. esto es la magia de profundidad, y en teoría, podría hacer cosas muy malas de hecho .) Ah ... esto ya estaba en lo mismo: Posibilidad de carga / ELF ejecutar archivos en OSX
  3. .

Otros consejos

yo acabamos de pasar una cierta hora seria tratando de hacer TCC ejecutar en OSX. He incluido varias correcciones, entre ellos el de la respuesta anterior, y ahora están todos en el repositorio de desarrollo en http://repo.or.cz/w/tinycc.git . La construcción, algunas pruebas y todos los ejemplos debería funcionar.

No estoy seguro de si son conscientes, pero el sitio http://bellard.org/tcc/ que pertenece a Fabrice Bellard que comenzó este proyecto, no se actualiza de forma regular. Sobre todo porque no hay muchas liberaciones 'oficiales' de TCC. TCC es uno de esos proyectos que en su mayoría vive de fuentes en vivo y actualizaciones. Así que si usted quiere dar a esta otra oportunidad, por favor vaya a http://repo.or.cz/ w / tinycc.git y obtener la rama 'mafia' (no 'maestro'). Por favor, vea http://repo.or.cz/w/tinycc.git para más detalles y no unirse a la lista de correo para involucrarse.

Los errores puede ser fijado por editar guión de configuración del paquete de TCC (ver 0.9.25).

En el script de configuración, la línea 36 dice cpu = uname -m Si ejecuta uname -m en la consola de Mac OS X, se imprime "i386", incluso si se trata de un sistema de 64 bits.

Una solución es hacer comentarios fuera de esta línea, y sustituirla por la CPU = x86_64,

A continuación, algunos errores de compilación se mostrará debido a las convenciones de nomenclatura de registro en Mac OS X, como se ha mencionado por dmckee en este hilo.

Mi solución es añadir unas pocas líneas a libtcc.c alrededor de la línea 1512. Por último se verá como

#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

Se recoge a continuación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top