有人成功编译了吗 TCC 在OS X上?

据我所知,这应该是可能的,但是当我运行时,我会得到以下错误:

$ 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上编译足够的程序来了解Pratfalls ...

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

谢谢!

有帮助吗?

解决方案

我现在会合并我的评论。

似乎有几个问题。

  1. Mac OS 10.5的X86寄存器访问的命名方案发生了变化。看 通过OS X上的UContext访问EIP和EBP. 。这将需要黑客入侵源,直到可以说服维护者支持Mac OS X。
  2. tcc 不要与Mac OS X本地运行的那些重叠。然而, xbinary 可以解决这个问题。 (我没有找到 Fink 包或a Macports 但是,包裹尚未安装。不确定我会 - 这是深层的魔法,从理论上讲,确实可以做非常糟糕的事情。)啊...这也已经如此: OSX上加载/执行ELF文件的可能性.

其他提示

我刚刚花了一些时间试图使TCC在OSX上运行。我包括了几个修复程序,包括上面答案中的一个修复程序,现在它们都在开发存储库中 http://repo.or.cz/w/tinycc.git. 。建筑物,一些测试和所有示例都应起作用。

我不确定您是否知道,但是 http://bellard.org/tcc/ 属于启动此项目的Fabrice Bellard的网站并未定期更新。主要是因为没有很多“官方” TCC发行。 TCC是主要依靠现场来源和更新的项目之一。因此,如果您想再次尝试一下,请去 http://repo.or.cz/w/tinycc.git 并获得“暴民”分支(不是“主”)。请参见 http://repo.or.cz/w/tinycc.git 有关详细信息,请加入邮件列表以参与其中。

错误可以通过TCC软件包的编辑配置脚本(VER 0.9.25)来解决。

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

一种解决方案是评论此行,并用CPU = x86_64替换为

然后,由于DMCKee在此线程中提到的Mac OS X中的寄存器命名约定,因此会出现一些编译错误。

我的修复是在第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

然后编译。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top