【发布时间】:2020-01-20 06:12:32
【问题描述】:
我正在关注 C compiler writing journey 到 generate assembly code 以评估二进制表达式值。
这是输出的汇编代码(保存在文件“out.s”中):
.text
LC0:
.string "%d\n"
_printint:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, %esi
leaq LC0(%rip), %rdi
movl $0, %eax
call printf@PLT
nop
leave
ret
.globl _main
_main:
pushq %rbp
movq %rsp, %rbp
movq $2, %r8
movq $3, %r9
movq $5, %r10
imulq %r9, %r10
addq %r8, %r10
movq $8, %r8
movq $3, %r9
movq %r8,%rax
cqo
idivq %r9
movq %rax,%r8
subq %r8, %r10
movq %r10, %rdi
call _printint
movl $0, %eax
popq %rbp
ret
当运行它时
cc -o out out.s
,它抱怨
out.s:13:2: error: unsupported symbol modifier in branch relocation
call printf@PLT
^
错误是如何发生的以及如何解决?
提前致谢!
PS:
- 我使用的是 macOS Catalina 10.15.2
- cc版本是
Apple clang version 11.0.0 (clang-1100.0.33.17)
Target: x86_64-apple-darwin19.2.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
- 源代码是用
cc -o comp1 -g cg.c expr.c gen.c main.c scan.c tree.c
【问题讨论】:
-
MacOS Mach-O 对象甚至使用 PLT 吗?还是只需要小写?这看起来不像 MacOS 的 asm。在 MacOS C 上,符号名称在 asm 中以
_为前缀,例如_printf。我认为.s文件看起来像是用于 Linux 的。相同的 x86-64 System V 调用约定;不同的名称修改约定。 -
call _printf有效。谢谢@PeterCordes -
@PeterCordes MacOS 和 iOS 不使用 PLT。 stackoverflow.com/questions/18260207/…
-
@Kamil.S:这个问题的答案并没有这么说。默认为不可插入符号并不意味着没有 PLT。我认为您的陈述是正确的(并且可以明显解释为什么这不会在 Mach-O 上组装,而不仅仅是无法链接),但是您的链接不会直接支持它,除非我错过了 cmets 中的某些内容或问题或答案中的旁注。
-
@PeterCordes 我也发现了这个stackoverflow.com/a/6447676/5329717,但不幸的是没有苹果文档参考来支持它。
标签: macos assembly compiler-errors clang mach-o