2016-11-18 10 views
6

나는 아래의 간단한 C 프로그램 (TEST.C) 작성 : -모호한 행동은

#include<stdio.h> 
int main() 
{ 
    return 0; 
} 

을하고 .bss라고 세그먼트의 크기 변화를 이해하는 follwing을 실행.

gcc test.c -o test 
size test 

출력

은 나왔다 : -

text data  bss  dec  hex filename 
    1115  552  8 1675  68b test 

전 세계적으로 또는 정적 범위의 무엇이든을 선언하지 않았다. 따라서 bss 세그먼트 크기가 8 바이트 인 이유를 설명하십시오.

나는 다음과 같이 변경했다 : -

#include<stdio.h> 
int x; //declared global variable 
int main() 
{ 
    return 0; 
} 

을하지만 놀랍게도, 출력은 이전과 동일했다 : -

text data  bss  dec  hex filename 
    1115  552  8 1675  68b test 

설명해주십시오. 예상대로

#include<stdio.h> 
int x=67; //initialized global variable 
int main() 
{ 
    return 0; 
} 

데이터 세그먼트 크기 증가,하지만 난 (아무것도 선언되지 때 8 반대로) BSS 세그먼트의 크기는 4 감소 기대하지 않았다 -이 : 나는 그 세계를 초기화. 설명 해주십시오.

text  data  bss  dec  hex filename 
1115  556  4 1675  68b test 

나는 또한 objdump 및 nm을 시도했지만 변수 x는 .bss (2 번째 경우)를 표시합니다. 그러나 크기 명령에는 bss 크기가 변경되지 않습니다.

다음 절차에 따라 : http://codingfox.com/10-7-memory-segments-code-data-bss/ 출력이 예상대로 완벽하게 발생합니다.

답변

5

간단한 main 프로그램을 컴파일하면 시작 코드도 연결됩니다. 이 코드는 무엇보다도 init bss를 담당합니다.

해당 코드는 .bss 섹션에서보고있는 8 바이트를 "사용하는"코드입니다.

당신은 -nostartfiles GCC 옵션을 사용하여 해당 코드를 제거 할 수 있습니다

는 링크 할 때 표준 시스템 시작 파일을 사용하지 마십시오

을 -nostartfiles. 표준 시스템 라이브러리는 -nostdlib하지 않는 한, 일반적으로 사용하거나 테스트가 다음 코드를

#include<stdio.h> 

int _start() 
{ 
    return 0; 
} 

를 사용하고

gcc -nostartfiles test.c 

알면 그것을 컴파일하려면

을 사용 -nodefaultlibs 참조 .BSS는 변수 x를 사용하지 않기 때문에 첫 번째 두 조각이 동일 0

text data  bss  dec  hex filename 
    206  224  0  430  1ae test 
1

로 설정합니다.

#include<stdio.h> 
volatile int x; 
int main() 
{ 
    x = 1; 
    return 0; 
} 

시도하고 당신은 .bss 크기의 변화를 볼 수 있습니다.

이러한 4/8 바이트는 시작 코드 안에 들어 있습니다. 그것이 무엇이며 크기가 다른 이유는 위에서 언급 한 시작 코드의 모든 세부 사항을 파헤 치지 않고도 알 수 없습니다.