OS X - 在 C 中使用内联汇编时体系结构 i386 的未定义符号
OS X - undefined symbols for architecture i386 when using inline assembly in C
我正在尝试编译包含以下函数的代码:
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 上编译得很好,所以问题似乎是 OS X 特定的。如何让这个工作?我不敢相信 Apple 没有在 Xcode 开发人员工具包(我有)中提供 i386 符号,所以这里可能配置有误...有什么想法吗?
编辑:因此 OS X 似乎默认不支持 intel 语法。有什么办法可以解决这个问题吗?
似乎 -masm=intel
在 OSX 默认 Developer Tools 安装中不受支持,根据 man gcc
,在至少在我目前使用的版本中:
gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on 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
似乎也不支持:
> clang --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: 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;
}
希望这对您有所帮助。 This SO post 也可能相关。
我正在尝试编译包含以下函数的代码:
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 上编译得很好,所以问题似乎是 OS X 特定的。如何让这个工作?我不敢相信 Apple 没有在 Xcode 开发人员工具包(我有)中提供 i386 符号,所以这里可能配置有误...有什么想法吗?
编辑:因此 OS X 似乎默认不支持 intel 语法。有什么办法可以解决这个问题吗?
似乎 -masm=intel
在 OSX 默认 Developer Tools 安装中不受支持,根据 man gcc
,在至少在我目前使用的版本中:
gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on 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
似乎也不支持:
> clang --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: 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;
}
希望这对您有所帮助。 This SO post 也可能相关。