2012-03-15 3 views
5

저는 툴 체인 (Yagarto 및 codesourcery) 크기 유틸리티를 사용할 때 얻는 결과에 대해 다소 혼란 스럽습니다. 그것은 데이터 섹션에서 0 바이트를 사용하고 있다고보고하고 있습니다. 내가 직접 내가 볼 연결지고 오브젝트 파일의 일부를 크기 도구를 통과 할 때 내 코드를 사용하고 흥미롭게 0초기화 된 RAM을 사용하고 있는데도 arm-none-eabi-size가 .data 섹션을 0으로보고하는 이유는 무엇입니까?

이외의 값으로 정적 RAM 변수를 초기화 알고

$ arm-none-eabi-size.exe rest-server-example.crazy-horse.elf 
    text data  bss  dec  hex filename 
    79364  0 34288 113652 1bbf4 rest-server-example.crazy-horse.elf 

아래 참조

text data  bss  dec  hex filename 
    1648  0  20 1668  684 obj_crazy-horse/uip-nd6.o 
    200  12 2652 2864  b30 obj_crazy-horse/uip-packetqueue.o 
    12  0  0  12  c obj_crazy-horse/uip-split.o 
    1816  24  48 1888  760 obj_crazy-horse/usb-core.o 
    284  0  0  284  11c obj_crazy-horse/usb-interrupt.o 
    2064  20  188 2272  8e0 obj_crazy-horse/xmac.o 

왜 오브젝트 파일은 데이터 섹션의 ELF 파일 보고서 0을 해요 것이라고 할 때 :

예를

데이터 섹션은보고되지 ake 그것은 0이 아닌 값을보고하고 있습니까? 참고로

나는 AT91SAM7X256 마이크로

편집을위한 임베디드 소프트웨어 작업입니다 : 우리가 명확하게 볼 수있는 오브젝트 덤프에서 다음 CFLAGS와 LDFLAGS

CFLAGS += -O -DRUN_AS_SYSTEM -DROM_RUN -ffunction-sections 

LDFLAGS += -L $(CPU_DIRECTORY) -T $(LINKERSCRIPT) -nostartfiles -Wl,-Map,$(TARGET).map 

편집 # 2를 추가

.data 섹션에 데이터가 할당되었지만 크기 유틸리티가 어떤 이유로 든 데이터를 가져 오지 않습니다. objdump link

내가 찾고있는 것은 내 RAM의 정확한 사용법을 얻는 것입니다. 내 변수 중 하나가 최적화되었는지 여부를 파악하려고하지 않습니다.

편집 3 : 크기 유틸리티가 데이터 섹션에서 무언가를보고 않음을 보여주는 자세한 내용

$ arm-none-eabi-size.exe -A -t -x rest-server-example.crazy-horse.elf 
rest-server-example.crazy-horse.elf : 
section    size  addr 
.vectrom    0x34 0x100000 
.text    0x10fc8 0x100038 
.rodata   0x149c 0x111000 
.ARM.extab   0x30 0x11249c 
.ARM.exidx   0xe0 0x1124cc 
.data    0x1028 0x200000 
.bss    0x7bec 0x201028 
.stack    0xa08 0x20f5f8 
.ARM.attributes  0x32  0x0 
.comment    0x11  0x0 
.debug_aranges  0xc68  0x0 
.debug_info  0x2b87e  0x0 
.debug_abbrev  0x960b  0x0 
.debug_line  0x9bcb  0x0 
.debug_frame  0x4918  0x0 
.debug_str   0x831d  0x0 
.debug_loc  0x13fad  0x0 
.debug_ranges  0x620  0x0 
Total    0x7c4c5 
+0

지도 파일도 확인했으며 메모리의 .data 영역에 할당 된 데이터를 표시합니다. – maguirre

+2

내 첫 번째 추측은 섹션이 최적화되고 있다는 것입니다. '--gc-sections' 및/또는'--function-sections'을 사용하여 컴파일하거나 링크하고 있습니까? –

+0

나는 더 많은 시야를 위해 원래의 포스트를 편집했지만 --function-sections을 사용하고 있습니다. 그러나 그것을 제거해도 아무 것도 변하지 않습니다 – maguirre

답변

2

내 해석은 링커 스크립트의 초기 값을 포함하는 단일로드 가능한 섹션을 만드는 것 데이터 섹션과 데이터를 초기화되지 않은 데이터 섹션에 복사하는 시작 코드 조각.

읽기 전용 메모리에서 실행할 수있는 단일 이미지 파일을 원할 경우 앞에 복사 한 ELF 로더가 없기 때문에 필요합니다.

일반적으로 이것은 입력 섹션을 두 번 매핑하는 대신 세그먼트 매핑 (즉, 출력 섹션은 > 섹션 배치 명령을 사용하여 링커 스크립트에 정렬 됨) 섹션에서만 수행 할 수 있지만 확실히 가능합니다 .

사용량은 매우 정확합니다. 텍스트 크기는 필요한 플래시 공간 크기이고, BSS 크기는 필요한 RAM 크기입니다. 초기화 된 데이터는 플래시의 초기 데이터에 대해 한 번, RAM의 수정 가능한 데이터에 대해 한 번 두 번 계산됩니다.

+0

죄송합니다 사이먼. 내 데이터 섹션에서 크기가 0 인 이유를 설명하는 방법을 이해할 수 있는지 확신 할 수 없습니다. – maguirre

+0

실행 파일은 ELF 파일로로드되지 않고 원본 바이너리 이미지로 변환되어 실행 중에 읽기 전용이 될 플래시 메모리에 기록됩니다. 따라서 출력 섹션 유형은 초기화/읽기 전용과 초기화되지 않은/읽기 - 쓰기의 두 가지 유형 만 가능합니다. 쓰기 가능한 데이터를 초기화하려면 초기 값을 나머지 .text/.rodata와 함께 초기화 된 공간에 저장하고 시작 후 쓰기 가능한 공간으로 복사하십시오. 이것은 자동으로 연결된 시작 코드에 의해 수행됩니다. –

+0

당신의 대답을 이해할 것 같습니다. 그러나 나는 그것이 내 문제에 대한 해답이라고 생각하지 않는다. 나는 처음부터 프로젝트를 다시 시작하기 위해 소스 카운트 롤을 사용했다. 한 부분에서 .data 섹션이 0이 아니기 때문에 뭔가를해야만했다. – maguirre

1

.data 섹션에 CODE 속성이 설정되어 있으며 "arm-none-eabi-size"라고 혼동합니다. .data 섹션의 크기가 데이터 크기 대신 총 텍스트 크기에 잘못 추가됩니다.

내 생각에 플래시에 저장되지만 RAM에서 실행해야하는 빠른 인터럽트 처리기 또는 플래시 리 프로그래밍과 같이 런타임에 램에 복사되는 코드가있는 것 같습니다.이것은 데이터 세그먼트에 대한 CODE 속성을 설정하고 "크기"는 모든 .data가 텍스트라고 생각합니다.

+0

그 사실을 어떻게 알 수 있습니까? 은 objdump에서 – maguirre

+0

: 섹션 : 5 .DATA 00,001,028 00,200,000 001125ac 00020000 2 \ * \ * 3 목차, ALLOC, LOAD, ** CODE ** –