OS X-在C中使用内联汇编时,架构i386的未定义符号

OS X-在C中使用内联汇编时,架构i386的未定义符号,c,assembly,i386,C,Assembly,I386,我正在尝试编译包含以下函数的代码: void print_stacktrace() { void *addr; asm("mov %0, esp;" : "=r" (addr)); } 如您所见,其中涉及一些内联i386程序集。问题是,在尝试运行时: clang -masm=intel -m32 test.c -o test 编译器输出: Undefined symbols for architecture i386: "esp", referenced from:

我正在尝试编译包含以下函数的代码:

void print_stacktrace()
{
    void *addr;
    asm("mov %0, esp;" : "=r" (addr));
}
如您所见,其中涉及一些内联i386程序集。问题是,在尝试运行时:

clang -masm=intel -m32 test.c -o test
编译器输出:

Undefined symbols for architecture i386:
  "esp", referenced from:
      _print_stacktrace in test-093116.o
ld: symbol(s) not found for architecture i386
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)
然而,代码在x64 Ubuntu上编译得很好,所以问题似乎是OSX特有的。如何让它工作?我不敢相信苹果没有在Xcode开发者工具包(我有)中提供i386符号,所以这里可能有些配置错误。。。有什么想法吗


编辑:看来默认情况下OS X不支持英特尔语法。有没有办法解决这个问题?

根据
man gcc
,OSX默认开发人员工具安装中似乎不支持或不支持
-masm=intel
,至少在我当前使用的版本中是这样:
gcc--版本

i686-apple-darwin11-llvm-gcc-4.2(gcc)4.2.1(基于apple Inc.build 5658)(llvm build 2336.11.00)

代码经过轻微修改后,编译并在OSX 10.7.x上运行。
>gcc-m32-masm=att-o test1 test1.c


在较新版本的OSX(10.10.x)中,
gcc
似乎被别名为
clang
-masm=intel
似乎也不受支持:
>叮当声--version

Apple LLVM 6.0版(clang-600.0.56)(基于LLVM 3.5svn)

目标:x86_64-apple-darwin14.1.0

线程模型:posix

>clang-m32-o test1 test1.c

#include <stdio.h>

void* print_stacktrace()
{
    void *addr;
    asm("mov %%esp, %0;" : "=r" (addr));
    return addr;
}


int main (int argc, char *argv[])
{
    printf("%p\n", print_stacktrace());
    return 0;
}
#包括
void*print_stacktrace()
{
无效*地址;
asm(“mov%%esp,%0;”:“=r”(地址));
返回地址;
}
int main(int argc,char*argv[])
{
printf(“%p\n”,print_stacktrace());
返回0;
}

希望这能有所帮助。也可能与此相关。

您的OSX运行在什么拱门上?可能与i386不兼容…如果程序集使用AT&T语法,那么它应该是
mov%esp,%0
@EugeneSh。它是x64 MacBook Air,但我在编译和运行32位C可执行文件方面没有问题,因此它似乎与i386兼容…您能给我们展示一下
gcc-v
(版本信息)的输出吗?我怀疑macports或自制中的gcc可能支持英特尔Syntax无需使用gct的默认值
-masm=att
,这是一个好答案,但我想知道是否有办法在OS X上启用intel语法。您可能无法启用没有的语法。只要试试`-masm=intel`就知道了。同时阅读手册。然而,正如@Michael Petch在评论中所说,macports或gcc的自制版本可能支持
intel
语法。可能一些商业编译器,如英特尔C编译器也支持。请看一看。好吧,看起来clang不支持英特尔语法(bug?),gcc不支持达尔文的英特尔语法,所以似乎没有简单的方法来启用。。。