【问题标题】:Problems compiling TCC on OS X在 OS X 上编译 TCC 的问题
【发布时间】:2011-04-12 09:23:28
【问题描述】:

有人在 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)

谢谢!

【问题讨论】:

  • 我运行 10.5 的 MacBook 遇到的错误与您报告的不同。您运行的是什么版本的操作系统和硬件?
  • 上述错误是在 10.6 上遇到的。在 10.5 上构建在程序中遇到与寄存器访问代码相关的实际错误...

标签: macos tcc


【解决方案1】:

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

我不确定您是否知道,但 http://bellard.org/tcc/ 站点属于启动此项目的 Fabrice Bellard,并没有定期更新。主要是因为没有多少“官方”tcc 版本。 tcc 是主要依赖实时资源和更新的项目之一。因此,如果您想再试一次,请转到http://repo.or.cz/w/tinycc.git 并获取“mob”分支(不是“master”)。详情请查看http://repo.or.cz/w/tinycc.git,并加入邮件列表参与其中。

【讨论】:

  • 我忘了提到目前 osx 上的 tcc 能够在 shell 和应用程序中用作脚本语言。它无法创建可以作为独立进程执行的二进制文件。
  • 非常很酷,感谢您提供此功能。如果您希望更多人使用它,您可能需要提供有关如何获取和构建它的具体说明。不是每个人都知道 git,并且需要获得 mob 分支会给外行增加额外的麻烦。
【解决方案2】:

我现在将整合我的 cmets。

似乎有几个问题。

  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

【讨论】:

  • 感谢您的回答!我能够在 OS X 下添加用于寄存器访问的备用代码并让 TCC 进行编译。但是,您指出的第二个问题是一个阻碍...我将不理会它,因为要为 MACH-0 二进制文件扩展 TCC 需要做很多工作。感谢您的帮助!
【解决方案3】:

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

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

解决办法是把这行注释掉,换成cpu=x86_64,

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

我的解决方法是在 libtcc.c 的第 1512 行附近添加几行。 最后它看起来像

#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

然后编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多