답변 감사합니다
말씀해주신대로 nasm 어셈블러 소스코드 다운받아 보고있는데요
제가 어지간한 소스코드는 분석할 수 있을 정도로 공부가 되어있다고 자부하고 있었는데
어떻게 손을 대야할지 눈 앞이 캄캄합니다.
그래도 프로그래밍 경력 20년이 넘는데 지금까지 헛 배웠나봐요. 흑흑
dwarf 문서도 다운 받아보았는데 내용 이해하기도 힘드네요. 흑흑
빌더(TWx) 님이 쓰신 글 :
: 기영테크 님이 쓰신 글 :
: :
: :
: : 안녕하세요
: :
: : RAD 10.2.2 토쿄 버전 쓰고있는데요
: : 64비트 스타트업 코드부터 소스레벨 디버깅 해보려고
: :
: : nasm -t -f elf64 -g -F dwarf -D_MT -D_MBCS -D_MBC_USE_MACROS -DCONSOLE c0nt64.nasm -o c0x64.o
: :
: : 위와 같이 -g -F dwarf 디버깅 옵션 줘서 컴파일 링크해 보았는데요
: :
: : c0nt64.nasm 의 스타트업 코드에 int3 브레이크 코드를 넣어서 컴파일 링크하니까
: : 어셈블러 스타트업 코드에서 브레이크가 걸리더군요.
: :
: : 그런데 dwarf 디버깅 정보 옵션을 주었는데도 기계어 레벨로만 디버깅이 되고
: : 소스레벨 디버깅이 안되더군요
: :
: : 심지어 C++ 소스레벨 디버깅도 덩달아 같이 먹통 되던데요
: :
: : 제가 옵션을 잘못 준 걸까요?
: : 아님 64비트 디버거 버그인 건가요?
: :
: : 어떻게 해야 어셈블러 스타트업 코드를 소스레벨에서 디버깅 할 수 있을까요
: :
: : 물론 C++ 소스코드레벨 디버깅이 먹통되는 희안한 현상도 막으면서 말이죠
: :
: : 컴파일러 고수 분
: : 알려주시면 고맙겠습니다
:
:
:
: 답변:
:
:
: C++ 빌더의 64 비트 컴파일러는 디버깅 포맷으로 dwarf 포맷을 사용하고 있고
: nasm 어셈블러 옵션도 아주 훌륭하게 설정되어 있습니다.
:
: 옵션을 제대로 설정했음에도 불구하고...
: Start-up 코드인 c0nt64.nasm 소스레벨 디버깅이 안되는 이유는...
:
: dwarf 디버깅 포맷의 버전이 다르기 때문 입니다.
:
:
: C++빌더의 64비트 C++ 컴파일가 생성하는 dwarf 디버깅 포맷 버전은 나온지 오래된 dwarf v2 버전이고
: nasm 어셈블러가 생성하는 dwarf 디버깅 포맷 버전은 dwarf v3을 코드베이스로 사용하기 때문 입니다.
:
: 엠바 애들이 매너리즘에 빠져있는 건지, 아님 게을러 터진 건지...
: 몇년 째 계속 clang 포팅 C++ 컴파일러도 3.3 코드베이스에 머물러 있고 (clang/llvm 헤드는 7.0),
: 현재 dwarf v5 디버깅 포맷이 사용되고 있는데 엠바 애들은 아직까지 dwarf v2 를 사용하고 있습니다.
:
:
: c0nt64.nasm 파일의 소스레벨 디버깅을 가능하게 하려면...
:
: nasm 어셈블러 프로그램을 dwarf v2 디버깅 포맷으로 생성하도록 프로그램을 수정해야 합니다.
: dwarf 포맷이 복잡하긴 하지만 다루어 본 경험이 있으면 코드 수정이 어렵진 않을 겁니다.
:
: 그리고...
:
: dwarf 2 포맷으로 생성하도록 nasm 어셈블러를 수정하더라도
: C++ 소스레벨 디버깅 까지 포함해서 가능하게 하려면 엠바 C++ 64 비트 컴파일러를 해킹해서
: 표준 스펙을 벗어난 디버깅 정보 Internal 을 알아내야 할 지도 모릅니다.
:
: 링크 과정에서 링커가 오브젝트 파일들과 라이브러리 파일들의 디버깅 정보를 하나의 단일 단위로
: 묶어서 머지를 할텐데, 포맷의 상이함이 발견되면 머지를 하지 않을 수도 있기 때문이죠.
:
: 여튼 뭐...
:
: dwarf 디버깅 포맷이 복잡하긴 하지만, 다루어 본 경험이 있으면 nasm 어셈블러를 수정해서 작업하면 됩니다.
: nasm 어셈블러가 오픈소스 이니...
:
|