2013-08-01 2 views
0

코드를 분해했습니다. 원본 소스 파일에서 해당 지침의 해당 줄 번호를 알고 싶습니다.암 어셈블리 코드 - cpp 소스의 분해 이해

또한 몇 가지 사항을 알고 싶습니다.

예를 들어 android::CameraHardware::createInstance과 같은 기능이 _ZN7android18CameraHardware14createInstanceEib으로 표시됩니다. 이 함수가 맞는지 아닌지 완전히 비교할 필 요는 없습니다.

왜 이름이 너무 이상하고 앞뒤에 사물이 추가 되었습니까? 나는 일반적으로 C 코드도 마찬가지이다. 함수 이름은 디스 어셈블 된 코드에서 곧바로 보입니다.

요약하면 두 가지 질문이 있습니다. GDB 내부

  • , 내가 어셈블리 명령어의 특정 행의 행 번호를 얻을 수있는 방법은 무엇입니까?

    0x40d9078c에서 예를 들어, 이 소스 파일에 해당하는 줄을 알고 싶습니다. 나는 정보 라인을 시도했다. 사용하지 마십시오. 어떤 제안이 있습니까?

  • 우리는 cpp 코드의 해체를 이해할 때 명명 규칙을 어떻게 이해합니까? 또한 에 필요한 다른 것들을 전제 조건으로 알고 있습니까?

감사합니다.

+0

힌트 : 당신의 직설적 인 이름을 놓친 경우 'extern "C"'를보십시오 – nijansen

+0

1) C++ 이름 맹 글링을 배우십시오. 2) DWARF와 같은 디버깅 기호 언어를 배웁니다. –

+2

'gdb'에 대해서는 모르겠지만'-SCld' 옵션과 함께'objdump'를 사용하면 원래의 소스와 줄 번호가 섞인 디스 어셈블리를 얻을 수 있습니다. – Michael

답변

3

android::CameraHardware::createInstance에서 _ZN7android18CameraHardware14createInstanceEib으로의 변환을 "이름 변경"이라고하며 C++의 경우 정상입니다. 다른 매개 변수를 사용하여 동일한 이름을 가진 여러 함수를 가질 수있는 방법이며 선언 한 경우에만 "foo(int x, double y)"을 찾을 수 없습니다. 그러나 정의하지 않았습니다. 안드로이드는 않는 - -

리눅스에서, 당신은 그것의 unmangled 형태로 변환 된 이름을 번역하는 c++filt을 사용할 수 있습니다 (리눅스 스타일 맹 글링 규칙 컴파일 있으리라 믿고 있지만 코드의 Microsoft 컴파일 된 조각을한다면, 그것은 분명히 같으면 '일하지 마라').

디버그 기호로 컴파일하면 gdb가 주어진 코드 조각의 소스를 표시 할 수 있어야합니다. 컴파일시 g++ 줄에 -g을 추가하십시오.

+0

Mats에 감사드립니다. 내 질문 아래 내 의견을 답장 해주실 수 있겠습니까?도움이 될 것입니다 –

+0

예, 'android.mk' 또는 그 의존성 중 하나에서 어떤 장소를 찾을 수있을 것입니다. 불행히도, 나는 정확히 어디서/어떻게 해야할지 모르겠다. 메이크는 "근처"고 덮 곳이 있다면 아마도 가장 쉬운 방법은 함수의 이름을 검색합니다 ('그렙 -r CameraHardware ::으로 createInstance *'안드로이드 시스템의 소스 코드를 보유하고 어떤 장소에) 한 다음 참조 소스 파일. –