在OS X上编译TCC的问题

时间:2010-09-14 21:04:57

标签: macos tcc

有没有人在OS X上成功编译TCC

据我所知,它应该是可能的,但是当我运行make时,我收到以下错误:

$ 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运行正常,并提供以下输出:

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

我很确定这个问题很简单,但是我没有在OS X上编译足够的程序来了解这些问题......

安装TCC的主要目的是获取libtcc所以我可以开始尝试从Ruby生成动态代码(如果有所不同:-p)

谢谢!

3 个答案:

答案 0 :(得分:27)

我刚刚花了一些时间来尝试在osx上运行tcc。我已经包含了几个修复程序,包括上面答案中的修复程序,现在它们都在http://repo.or.cz/w/tinycc.git的开发存储库中。构建,一些测试和所有示例都应该有效。

我不确定您是否知道,但是开始此项目的Fabrice Bellard所属的http://bellard.org/tcc/网站并未定期更新。主要是因为没有很多'官方'tcc发布。 tcc是那些主要依赖于实时来源和更新的项目之一。所以如果你想再试一次,请转到http://repo.or.cz/w/tinycc.git并获得'mob'分支(不是'master')。有关详细信息,请参阅http://repo.or.cz/w/tinycc.git,并加入邮件列表以参与其中。

答案 1 :(得分:3)

我现在要巩固我的意见。

似乎有几个问题。

  1. 自Mac OS 10.5起,x86寄存器访问的命名方案发生了变化。见Access EIP and EBP via ucontext on OS X。这将需要黑客攻击源,直到维护者可以说服它支持Mac OS X.
  2. tcc支持的可执行格式与Mac OS X本机运行的格式不重叠。但是,XBinary可以解决此问题。 (我没有找到fink包或MacPorts包,但是还没有安装它。不确定我会 - 这是很神奇的,理论上可以做到确实是非常糟糕的事情。)啊......这也已经出现了问题:Possiblity of loading/executing ELF files on OSX

答案 2 :(得分:3)

可以通过编辑TCC包的配置脚本(版本0.9.25)修复错误。

在配置脚本中,第36行说 CPU = uname -m 如果你在Mac OS X的控制台中运行uname -m,即使它是一个64位系统,也会输出“i386”。

解决方案是注释掉这一行,并用cpu = x86_64,

替换它

然后会出现一些编译错误,因为Mac OS X中的寄存器命名约定,正如dmckee在此主题中所提到的那样。

我的修复是在第1512行附近向libtcc.c添加几行。 最后它看起来像

#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

然后编译。