2010-02-25 5 views
11

가까운 시간대에 ARM 프로세서에서 실행하려는 C 프로그램을 만들고 있습니다. 스택/힙의 크기를 무시하면서 전역 변수를 사용하여 메모리 양을 측정하고 싶습니다. 컴파일시에 gcc를 덤프하거나 컴파일 된 바이너리에서이 정보를 검색하는 방법이 있습니까?글로벌 변수의 총 크기는 어떻게 측정합니까?

답변

10

메모리가 어디로 가고 있는지 확인하는 가장 좋은 방법은 링커 맵을 보는 것입니다. 링커 맵은 링커에서 생성하고 프로그램의 모든 메모리 위치를 자세히 설명하는 파일입니다. 전역 변수와 코드에 대한 심볼 단위의 메모리 할당을 볼 수 있습니다. 나는 메모리 요구 사항이 엄격한 프로젝트를 위해 과거에 링커 맵을 사용했다. 공간을 많이 차지하는 전역 메모리 버퍼와 같은 문제 영역을 쉽게 식별 할 수 있습니다.

-Wl, -map =

output.map :

링커 맵을 생성하기 위해 GCC 명령 줄에이 옵션을 추가
2

으로 다른 메모리 세그먼트를 분석해야합니다. 기사에 대해서는 here을, 이에 대한 자세한 내용은 here을 참조하십시오.

7

GNU binutils 제품군에는 "크기"라는 프로그램이 포함되어 있습니다.이 프로그램은 필요한 데이터를 얻는 가장 쉬운 방법이며, 최소한 합리적인 근사치입니다. 처음 세 열을 바이너리의 섹션의 크기입니다

text data  bss  dec  hex filename 
332268 2200 19376 353844 56634 test-directory/add 

: (이 경우, 적지 않은 임베디드 하나) 일반 프로그램의 경우, 출력은 다음과 같을 수 있습니다 "텍스트"실행 코드가, "데이터"는 명시적인 이니셜 라이저로 초기 변수를 나타내는 것을 포함하여 상수 등이며 "bss"는 암시 적으로 정적으로 초기화되는 모든 것에 대한 이니셜 라이저입니다. 일반적인 임베디드 프로그램에서 정적 초기화 프로그램은 전역 변수에 대해 독점적으로 사용됩니다 (스택이나 힙에 있지 않으므로 측정에 다른 정적 변수를 포함하는 것이 좋습니다).

따라서 "데이터"와 "bss"의 합계가 결국 원하는 것입니다. (hlovdal에 연결된 기사를 읽은 후에 나는 이것보다 확신이 없으며, 아마도 의견 작성자가 확인을 추가 할 수 있습니까?)

(그 다음에 "dec"과 "hex"는 모든 십진수의 총 크기입니다. 16 진수이며 "filename"은 물론 명확합니다.)

관련 문제