c - 如何使用 GCC 获取与程序集输出内联的源代码行?

标签 c macos gcc assembly

我想让 C 源代码行与程序集输出内联,以查看正在生成的代码。

我已经尝试过 GCC 选项,例如 -S -Wa,-ahlms(甚至是 -Wa,--gstabs 因为我读过它在某个地方)。

哦!顺便说一句,我在 Mac 上,所以我没有 objdump

(对不起,时间太短了,我得下车了!)

gcc pc-clisp.c -S -g -fverbose-asm -fnested-functions 的输出

.globl _getBool
_getBool:
LFB32:
LM21:
    pushl   %ebp    #
LCFI30:
    movl    %esp, %ebp      #,
LCFI31:
    subl    $8, %esp        #,
LCFI32:
LM22:
    movzbl  8(%ebp), %eax   # atom.pred, D.4112
    movzbl  %al, %eax       # D.4112, D.4113
    andl    $-16, %eax      #, D.4114
    sarl    $4, %eax        #, D.4115
    testl   %eax, %eax      # D.4115
    setne   %al     #, tmp64
    movzbl  %al, %eax       # tmp64, D.4111
    leave
    ret
LFE32:

最佳答案

也许调试 + 后处理步骤?

gcc <source.c> -S -g -fverbose-asm

找到.file 1 "1.c" 告诉你文件号到文件名的映射。 然后在 .loc 1 8 0 行之后添加源代码。我不确定如何使用单个 shell 命令执行此操作,但一个简短的脚本应该能够执行此操作:

#!/usr/bin/env python

import re
import sys

filename = sys.argv[1]

f = open(filename)
lines = f.readlines()
f.close()

FILE_RE=re.compile(r"\s+\.file (\d+) \"(.*)\"")
LOC_RE =re.compile(r"\s+\.loc (\d+) (\d+)")

output = []
files = {}
for line in lines:
    output.append(line)
    mo = FILE_RE.match(line)
    if mo is not None:
       files[mo.group(1)] = open(mo.group(2)).readlines()
       print mo.group(1),"=",mo.group(2)
       continue
    mo = LOC_RE.match(line)
    if mo is not None:
       print mo.group(1),"=",mo.group(2)
       source = files[mo.group(1)][int(mo.group(2))-1]
       output.append("\t#"+source)

f = open(filename+".2","w")
f.writelines(output)
f.close()

关于c - 如何使用 GCC 获取与程序集输出内联的源代码行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2412816/

相关文章:

c - 将输入值存储在结构中以便稍后进行最快的比较

macos - 如何在一段时间后关闭警报并每 10 分钟重复一次

Java - Mac os x - 两个版本

linux - 在 MAC 上安装 bcftools 时如何修复此错误? C : [ploidy. o] 错误 1 ​​的问题

c - 为什么 SIGINT 停止 sleep 不止一次?

c - 什么是MinGW的简单解释

macos - 列出所有应用程序的所有窗口

c - GCC 透明联盟

c++ - 内联静态数据导致节类型冲突

c - Unix C 套接字服务器不接受连接