2008-10-14 5 views
6

어떻게 그 프로그램 내에서 프로그램의 메모리의 .text 섹션에 대한 포인터를 얻나요? 백그라운드에서 실행되는 연속 셀프 테스트의 일부로 "플래시 투 메모리 (Flash to Memory)"비교를 수행하는 섹션 길이가 필요합니다..text 섹션에 대한 포인터를 어떻게 얻습니까?

이 도구 세트는 내가 사용하고있는 도구에 대한 링커 .cmd 파일을 자동으로 생성하며 사용중인 보드 용 보드 지원 패키지는 자체 생성 대신 생성 된 .cmd 파일을 사용해야합니다. (아니 나중에 파일을 그것과 함께 muck 스크립트를 추가하십시오.)

편집 : 나는 코드 작곡자 3.1 환경을 사용하여 TI TMS 6713 DSP와 함께 일하고 있습니다. 제가 사용하고있는 카드는 고객이 계약을 맺고 다른 조직에서 제작 했으므로 그 카드에 대한 정보를 알려 드릴 수 없습니다. 그러나 BSP는 TI의 "DSP BIOS"설정 도구에 의존하고 있으며 범위를 벗어난 노력을하지 않고 설정을 너무 많이 퍼지 할 수는 없습니다.

답변

4

"변수"를 링커 스크립트에 넣어야합니다.

내 섹션으로 이것을 가지고 내 프로젝트 중 하나에 : C 프로그램에서

__FlashStart = .; 

나는이 있습니다

extern unsigned long int _FlashStart; 
unsigned long int address = (unsigned long int)&_FlashStart; 
4

당신이를 수정할 수 있다면 그것은 확실히 쉬울 것이다 링커 스크립트. 할 수 없으므로 프로그램 바이너리에서 섹션 이름, 주소 및 크기를 추출 할 수 있습니다. 예를 들어, 다음은 libbfd를 사용하여 모든 코드 섹션을 검사하는 방법입니다.

#include <bfd.h> 

bfd *abfd; 
asection *p; 
char *filename = "/path/to/my/file"; 

if ((abfd = bfd_openr(filename, NULL)) == NULL) { 
    /* ... error handling */ 
} 

if (!bfd_check_format (abfd, bfd_object)) { 
    /* ... error handling */ 
} 

for (p = abfd->sections; p != NULL; p = p->next) { 
    bfd_vma base_addr = bfd_section_vma(abfd, p); 
    bfd_size_type size = bfd_section_size (abfd, p); 
    const char *name = bfd_section_name(abfd, p); 
    flagword  flags = bfd_get_section_flags(abfd, p); 

    if (flags & SEC_CODE) { 
     printf("%s: addr=%p size=%d\n", name, base_addr, size); 
    } 
} 

. 텍스트 세그먼트 만보고 싶다면 섹션 이름에 대해 strcmp를 지정하십시오.

이 접근 방식의 단점은 무엇입니까? Libbfd는 GPL로 라이센스되어 있으므로 전체 프로젝트가 GPL로 인해 어려움을 겪을 수 있습니다. 상업 프로젝트의 경우 이는 비 초보자 일 수 있습니다.

바이너리가 ELF 형식 인 경우 대신 libelf를 사용할 수 있습니다. libelf API의 작동 방식에 익숙하지 않아 샘플 코드를 제공 할 수 없습니다. 리눅스 libelf도 GPL이지만, BSD 프로젝트에 여러분이 사용할 수있는 libelf가 있다고 생각합니다.

편집 : 최소 실시간 OS 환경에서 DSP로 작업 할 때이 대답은 효과가 없을 것입니다. 미안, 노력했다.

1

당신은 당신이 관심있는 툴 체인 및 아키텍처 명확히 수 없습니다. 지금 바로 (IAR ARM C/C++) 세그먼트 주소 __sfb(...)을 시작 반환 컴파일러에 내장 된 사업자가 사용하고 컴파일러에

을 세그먼트 끝 주소 __sfe(...) 및 세그먼트 크기는 __sfs(...)

1

당신이 찾고있는 기호는 __text____etext__은 각각 시작과 .text 섹션의 끝 부분에있는 점.

.map 파일은 응용 프로그램에 정의 된 모든 기호와 섹션을 나열하므로 유용 할 수 있습니다.

관련 문제