gcc 컴파일 과정을 gdb로 분석하려고 하는데 질문 있습니다.

neweapon1127의 이미지


일전에도 관련해서 질문 올린적 있는데 해소되지 않아 다시 질문드립니다.
졸업 논문 관련해서 gcc-4.1.2 소스를 분석해야하는데 이것에 관해 완전 초보라서
실험실 조교의 추천에 따라 gdb로 gcc를 디버깅해가면서 분석하고 있습니다.
이를 위해 gcc-build라는 디렉토리를 만들어 gcc-4.1.2 버전을 configure하고 make해서
새로 구성하였습니다. 그리고 간단한 test.c라는 파일을 만들어서 test.c가 gcc에 의해
어떻게 컴파일 되는지 보려고 하는데 잘 되지가 않네요.
제가 하고 있는 방법을 보여드릴테니 잘못된 점 있으면 지적 부탁드립니다.

질문 1)
gcc를 새로 구성하고 나니까 cpp, cc1, as 등의 실행파일이 새로 생겼는데,
cpp는 컴파일 단계에서 전처리 과정을 수행하고 cc1에서 구문 분석 등의 컴파일을 수행한다고 들었습니다.

제가 관심있는 부분은 front-end에서 AST(abstract syntax tree)가 생성되는 원리이므로
gdb를 실행할때

gdb cc1

을 입력하고 디버깅 모드로 들어갑니다.
gdb로 들어간 후,

set args test.c

해서 cc1이 test.c 를 컴파일 할 수 있도록 지정해주구요.
일단 breakpoint 지정 없이 한번 run 명령을 입력해보면
(no debugging symbols found)라는 메세지가 나오는데 이 메세지가 뜻하는게 무엇인지 궁금합니다.

질문 2)
그리고 컴파일에 관해 관련된 문건들을 몇 개 찾아본 결과
test.c를 컴파일 할 경우 전처리 과정에서 test.i라는 파일이 생성되고
test.i를 cc1이 받아서 back-end를 위한 test.s라는 파일을 생성한다고 한 것 같은데
그럼 cc1을 gdb로 돌릴때 test.i 파일을 만들어서 입력으로 주어야 하나요?

이를 위해 gdb 실행 전에 gcc -v --save-temps -o test test.c 를 실행하여
test.i test.s 파일을 만든 후 다시
gdb cc1 명령으로 gdb로 들어간 후 set args test.i 하고 run을 해보았는데
아무런 컴파일이 되지 않는 것 같습니다.
cc1의 입력으로 .c가 맞나요? 아님 .i가 맞나요?

질문 3)
또 하나 test.c 파일에 #include 를 해서 pritnf 함수를 쓸 경우
gdb로 돌리기 전에 그냥 명령 프롬프트에서 일반적인 컴파일을 수행하면
아무런 에러가 나지 않는데 gdb cc1 모드에서 test.c를 입력으로 주면
에러메세지가 여러 줄에 걸쳐 나타납니다. test.c에서 printf 부분을 제거하고
아무런 헤더 파일을 쓰지 않으면 그와 같은 메세지가 나지 않구요.
경로 지정에 문제가 있는게 아닌가 싶어 gdb로 들어간 후,

set args test.c -I /usr/include

라고 지정해주어도 같은 에러가 납니다.
에러 메세지 중 일부를 보여드리면 다음과 같습니다.

(gdb) r
warning: cannot close "shared object read from target memory": File in wrong format
In file included from test.c:1:
/usr/include/stdio.h:34:21: error: stddef.h: 그런 파일이나 디렉토리가 없음
In file included from /usr/include/_G_config.h:44,
from /usr/include/libio.h:32,
from /usr/include/stdio.h:72,
from test.c:1:
/usr/include/gconv.h:72: error: expected declaration specifiers or ‘...’ before ‘size_t’
/usr/include/gconv.h:88: error: expected declaration specifiers or ‘...’ before ‘size_t’
/usr/include/gconv.h:97: error: expected declaration specifiers or ‘...’ before ‘size_t’
/usr/include/gconv.h:174: error: expected specifier-qualifier-list before ‘size_t’
In file included from /usr/include/stdio.h:72,
from test.c:1:

난잡하게 너무 많은 질문을 드린 것 같은데 관련해서 작은 조언이나마 부탁드립니다 (__)

jachin의 이미지

적어도 질문 1과 2에 대한 이해를 돕는데 도움이 되실만한 문서를 링크해드릴께요. 저도 '번역'하면서 알게 된 페이지지만...

http://www.onlamp.com/pub/a/onlamp/2007/04/03/getting-familiar-with-gcc-parameters.html

질문 1에서 물어보신 "No Debugging Symbol found"는 말 그대로 디버깅을 위한 심볼이 없었다는 얘기입니다. 전처리를 끝낸 파일에는 순수한 C 코드가 있겠지요? 그 함수들 대부분은 '호출'의 형태로 점프 어드레스를 컴파일러로부터 (베이스 주소의 상대주소로) 할당받게 될 것입니다. 어셈블러로 들어가기 이전에 그 주소 부분을 '심볼'로 지정하게 되는데, '디버깅'을 위한 심볼로 각 함수의 호출 주소를 지정하지 않았다는 뜻이지요.

질문 2에서 물어보신 내용은 위의 링크 내용을 읽어보시면 아시겠지만, 실제로 cc1을 통해 입력되는 내용은 '전처리가 완료된 순수한 C 코드'입니다. 따라서 .c 형식의 파일이 되겠지요. 물론 include 내의 소스도 포함한 소스코드로요. 아마 .i 는 include 지정 헤더에서 사용된 함수 소스를 담아둔 파일일 것입니다. cc1을 통해 처리된 내용은 하드웨어와 독립된 형태의 코드가 될 것입니다.

질문 3번에 대해서는 정확히 답변해드릴 수 없을것 같군요. stdio.h도 먼저 호출한 함수 헤더가 있을 것입니다. 그 헤더파일의 위치를 같이 기재하지 않아서 그런 것이 아닐까요? 그러나 printf() 함수가 stdio.h 파일에 지정되어 있지는 않는 것으로 알고 있는데, printf() 때문에 문제가 일어났다니 조금 의아하군요.
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

neweapon1127의 이미지


답변 내용이 완전히 이해가지는 않지만^^;; 참고해서 더 공부해봐야할 것 같네요.

추후에 좀 더 해보고 궁금한 점 있으면 다시 질문 올릴테니 답변 부탁드릴게요~~^^

Arcy의 이미지

잘 모르지만 주제넘게 나서보면..

1) Makefile 이나 configure 옵션을 바꿔서 CC 옵션에 -g 를 주세요. 그러면 컴파일할때 디버깅 심볼을 넣어서 잘 보입니다.

처음부터 주욱 디버깅 해보시려면, 로딩한 다음에 break main 해주시고 run test1.c 하면 main 첫줄부터 디버깅 합니다. next, step 해보시고 차츰 다른 브레이크포인트를 잡은 뒤 계속 실행해보셔도 되겠습니다.

파일들의 입출력을 보기에는 strace 가 편리합니다. strace cc1 test1.c 하시면, 프로그램이 돌아가면서 쓰는 시스템 콜 내역이 주르륵 나옵니다. 그 중 fopen 주의깊게 보세요. 이녀석이 어떤 파일을 읽고 쓰는지 흐름을 볼 수 있습니다. > 로 결과를 리다이렉션시켜서 vim 으로 열어보면 이쁘게 잘 보입니다.

neweapon1127의 이미지


답변 감사합니다. 많은 도움이 될것 같네요^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.