당신이를 수정할 수 있다면 그것은 확실히 쉬울 것이다 링커 스크립트. 할 수 없으므로 프로그램 바이너리에서 섹션 이름, 주소 및 크기를 추출 할 수 있습니다. 예를 들어, 다음은 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로 작업 할 때이 대답은 효과가 없을 것입니다. 미안, 노력했다.