c - 在 Mac OS X 上组装和链接 gcc 生成的程序集

标签 c macos gcc assembly

如果我有如下C代码

int main()
{
    return 77;
}

我可以在 clang 上使用 -S 选项生成 asm 代码以获得以下内容(Intel 语法)

$clang -O0 -mllvm --x86-asm-syntax=intel main.c -S 

接下来的代码是

    .section    __TEXT,__text,regular,pure_instructions
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    push    RBP
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset rbp, -16
    mov RBP, RSP
Ltmp4:
    .cfi_def_cfa_register rbp
    mov EAX, 77
    mov DWORD PTR [RBP - 4], 0
    pop RBP
    ret
    .cfi_endproc


.subsections_via_symbols

但是 as、gas 或 nasm 都不会生成目标文件来与 ld 链接...clang 或 gcc 是否生成实际良好的“准备就绪”asm? gcc 的默认汇编程序是 gas(它甚至没有安装在 mac os x 上...?对于 clang 不是一样的吗)。

那么如何手动汇编asm代码然后链接呢?

最佳答案

  1. 是的,gcc 生成正确的汇编代码。

  2. 它只是as

  3. 您应该能够使用 as 进行组装并使用 ld 进行链接:

    as -o example.o example.s
    ld -macosx_version_min 10.8.0 -o example example.o -lSystem
    

    或者,使用 gccclang 作为前端可能更容易:

    cc -o example example.s
    

编辑:完整的工作示例:

$ cat example.c 
int main()
{
    return 77;
}
$ gcc -S example.c -o example.s
$ as -o example.o example.s
$ ld -macosx_version_min 10.8.0 -o example example.o -lSystem
$ ./example 
$ echo $?
77

好的,既然您使用的是 clang,那么您可能也想使用它的汇编程序。混合和匹配工具链通常以泪水告终:

$ clang -cc1as -filetype obj -mllvm --x86-asm-syntax=intel -o example.o example.s
$ ld -macosx_version_min 10.8.0 -o example example.o -lSystem

关于c - 在 Mac OS X 上组装和链接 gcc 生成的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18578347/

相关文章:

c - 为什么 Swift 在这个图像处理测试中比 C 慢 100 倍?

gcc - 为什么有些图书馆打不开?

c - "Stray '\' in program, ' 否则 ' without ' 如果'

c - 关于表达式的后增量

c - 为什么strcmp不返回0

python - 合并带有时间戳的 csv 文件

excel - "Object doesn' t 支持此操作"用于 Excel 2011 (Mac OS X) 中的下拉菜单

c - 在GCC中编译C文件时出错(多个文件合而为一)

c - Sublime Text 3,GCC 构建系统问题

r - 错误 : package or namespace load failed for ‘data.table’ in library. dynam(lib, package, package.lib): 找不到共享对象 ‘datatable.so’