2010-03-09 4 views
13

어셈블리 출력과 함께 C 소스 라인을 인라인으로 만들어 어떤 코드가 생성되는지 확인하고 싶습니다.GCC를 사용하여 어셈블리 출력으로 인라인 라인을 인라인 할 수 있습니까?

-S-Wa,-ahlms과 같은 GCC 옵션을 사용해 보았습니다 (심지어 어딘가에서 읽을 수 있기 때문에 -Wa,--gstabs).

오! BTW, 나는 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: 
+0

마치 Mac에서 쉽게 할 수없는 것처럼 보입니다. 1) objdump가없고 otools도 작업을 수행하지 않습니다. 2) 최신 버전의'gdb'는'disas/m '입니다 - Mac은 오래된'gdb'를 가지고 있습니다. 3) 나는'GCC '의 어셈블러 출력이 맥에서별로 도움이되지 않는다고 생각한다. 4) 왜 Xcode를 사용해야합니까? (대답하지 마십시오). – philcolbourn

+0

이 질문 직후 리눅스를 설치하고 OS-X를 포기했지만 더글라스는 해결책에 더 가깝습니다. – philcolbourn

+0

코드의 작은 부분을보고 있다면 [이 해답에서 설명] (http://stackoverflow.com/a/25781924/1708801)과 같이 간단한 솔루션이 될 수 있습니다. –

답변

10

아마도 디버깅 + 후 처리 단계입니까?

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

찾기 .file 1 "1.c" 이름 매핑을 제기하면 파일 번호를 알려합니다. 그런 다음 .loc 1 8 0 행 뒤에 소스를 추가하십시오. 나는 하나의 쉘 명령을 사용하는 방법을 잘 모르겠지만, 짧은 스크립트는 그것을 할 수 있어야한다 :

#!/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() 
+0

감사. 이것은 흥미로운 것 같습니다. 그러나 어셈블러 파일에는 .file 또는 .loc 문이 포함되어 있지 않습니다. 나는 어셈블러를 질문에 게시 할 것이다. – philcolbourn

+1

gcc 명령 줄에 "-g"를 추가하여 ".loc"행을 얻을 수 있습니다. 유용한 스크립트를 위해 더글러스에게 +1 : 정확히 내가 무엇을 찾고 있었습니까. 바퀴를 재발 명할 필요가 없습니다. – snap

5

출력 (죄송이 짧고, 나는! 기차를 얻을 수있다),하지만 당신은 -S -fverbose-asm가 도움이 찾을 수 있습니다.

+0

감사합니다. 이것은 -S보다 확실히 좋습니다. 줄 번호와 사용되는 변수를 식별하는 유용한 주석을 얻습니다. – philcolbourn

+0

사실, 나는 그들이 줄 번호인지 모르겠습니다. – philcolbourn

2

당신은 MacPorts를 통해 objdump를 얻을 수 있습니다. 그냥 "binutils"패키지를 넣은 다음 "gobjdump"를 사용하십시오.

+0

감사합니다. 나는 macports와 fink를 시도했다. 둘 다 좋지만 유지하기가 힘들었습니다. 나는 맥 포트 (macports)와 호의적 인 멍청이를 포기했다. 아마 VM에서 리눅스를 돌리는 것이 더 쉽습니다. – philcolbourn

관련 문제