2011-02-02 2 views
1

obj 파일의 이진 명령어의 레지스터가 어떤 변수인지 알아야합니다. 한마디로
: 가정하자 objdump를이 같은 OBJ 파일의 미리보기 제공 : 각 명령의 변수에 레지스터에서 매핑 예gcc는 어떤 변수에서 컴파일 된 레지스터를 알려주는 것입니까?

MOV R1 5  # move 5 to register R1 
SW R2 SP[-20] # store the value of R2 to address SP-20 

우리는 어떻게 알 수 R1 저장 변수가 , 말, var1 소스 코드에서? 그리고 R2 상점 var2?

나는 의 독자를 알고 있습니다., 불행히도 헛된 것입니다.
(원본과 바이너리 간의 라인 매핑을 제공 할 수 있지만 더 이상 도움이되지 않습니다.)

그런 다음 gcc와 링커의 디버깅 옵션을 검색했습니다. 유용한 정보를 찾았지만 여전히 문제를 해결하지 못했습니다. 모든 변수를 추적 할 수 있습니다 -fdump-RTL-vartrack

  • 옵션 및 유용 할 것으로 보인다
    내가 찾은 정보입니다. 하지만이 옵션으로 컴파일 할 때 예상되는 .vartrack 덤프 파일을 찾지 못했습니다.
  • 옵션 * fdump-rtl-vartrack-uid에는 각 변수의 고유 ID (DECL_UID)가 표시됩니다. 하지만이 오류가 발생했습니다 : cc1 : 오류 : 인식 할 수없는 명령 줄 옵션 "-fdump-tree-uid"
  • 옵션 fdump-rtl-lreg 덤프 로컬 레지스터 할당,하지만 어떻게 말해 줄 수 없어 reg로부터 변수에의 매핑.

경험이나 아이디어가있는 사람이 있습니까?

감사합니다.

해킹 ...

+0

왜 알아야합니까? – delnan

+0

@delnan : 곧 특정 지시 사항에 대한 변수를 추적하거나 추적해야합니다. 하지만이 매핑을 얻을 수 있다면 훨씬 더 많은 작업을 수행 할 수 있습니다. – lukmac

답변

0

컴파일러가 혼합 어셈블러/소스 코드 목록을 생성하는 것은 꽤 흔한 일입니다. 컴파일 된 소스 코드가 표시되고 그 아래에 생성 된 어셈블러 코드가 표시됩니다. 빠른 구글은 약간의 도움이 될 수

http://www.delorie.com/djgpp/v2faq/faq8_20.html

+0

고마워요! 이 정보는 소스 코드 라인과 이진 명령어 주소 사이의 ** 라인 매핑 **을 사용하여 얻을 수 있습니다. 하지만 bin 변수와 소스 변수 사이의 명시적인 ** 매핑을 알고 싶습니다. – lukmac

+0

"var1 = 5;"라는 줄이 있기 때문에 까다 롭습니다. 다음 instr이 컴파일 된 것을 볼 수 있습니다. "sw r1 sp [-20]; lw r1 sp [-24]; mov r1 5" 여기서 첫 번째 "sw"은 "var1"을로드하기 전에 스택에 변수 "var2"를 저장합니다. 따라서 나는 그 instr에 대해 "r1"은 "var2"를 의미하고 "lw"instr에 대해서는 "r1"이 "var1"을 의미한다는 것을 알아야합니다. 이 정보는 혼합 된 asm/소스 목록에 의해 제공되지 않습니다. – lukmac

0

GCC의 "-fverbose-ASM"옵션을 제공합니다. 컴파일러의 출력에 변수 이름으로 주석을 붙입니다. 불행히도, 이름은 종종 "D.1234"와 같이 컴파일러에 의해 고안된 임시적인 것입니다. 그것은 당신에게 무슨 일이 일어나고 있는지 알려주는데 여전히 도움이 될 수 있습니다.

간단한 무언가를 컴파일 시도하고 살펴 :

gcc -g -O0 -S -fverbose-asm foo.c -o foo.s 

변수가 DWARF 디버그 정보가 생성 사용하고 (대부분의 시스템) 프로그램에서 특정 지점에 저장되어있는 GDB 같은 디버거를 파악하는 방법 컴파일러가 객체 파일에 저장합니다.당신의 시스템이 DWARF를 사용한다면, readelf은이 정보에 대한 아주 기본적인 해석을 할 것입니다. 이것을 시도하십시오 :

readelf --debug-dump=info foo.o 

분명히 해독하기가 쉽지 않습니다. 이동 중에 DWARF 표준 (http://dwarfstd.org/)을 확인하십시오.

관련 문제