2010-03-22 3 views
12

gcc로 릴리스 빌드를 할 때 (즉, -g을 지정하지 않은 경우), 바이너리에서 심볼로 끝나는 것처럼 보이고,이를 제거하려면 strip을 사용해야합니다. 사실, 여전히 함수를 중단하고 gdb에서 백 트랙트를 얻을 수 있습니다 (줄 번호는 없지만).gcc가 비 디버그 빌드에 심볼을 추가하는 이유는 무엇입니까?

놀랍게도 - 아무도 이런 일이 일어나는 이유를 설명 할 수 있습니까?

gcc -o foo foo.c

nm foo | grep blah

#include <stdio.h> 

static void blah(void) 
{ 
    printf("hello world\n"); 
} 
int main(int argc, char *argv[]) 
{ 
    blah(); 
    return 0; 
} 
:

08048374 t blah

답변

10

디버그 기호와 링커 기호 사이에 큰 차이가있다. 디버그 심볼은 코드 위치 등을 소스 파일 이름과 행 번호 및 디버거, 프로파일 러 등을 돕는 다양한 유용한 것들과 매핑합니다. 링커 심볼은 코드에서 다양한 진입 점 및 기타 중요한 위치의 주소를 정의합니다. 실행 파일을 완전히 익명으로 만들고 싶다면 strip을 사용해야합니다.

6

이것은 GCC의 기본 동작입니다. 디버그 정보를 포함하고 아무 것도 가지고 있지 않는 것 사이의 유용한 유용한 절충안. 물론 스트립핑이 기본값이어야한다고 주장 할 수 있지만, 단지 -s을 추가하거나 strip 명령을 사용하여 어쨌든 제어 할 수 있습니다.

관련 문제