2008-10-14 2 views
6

Как вы получаете указатель на .text-раздел памяти для программы из этой программы? Мне также нужна длина раздела, чтобы сделать «Flash to Memory» сравнить как часть непрерывного самотестирования, который работает в фоновом режиме.Как вы получаете указатель на раздел .text?

Набор инструментов автоматически генерирует файл .cmd компоновщика для инструментов, которые я использую, и пакет поддержки Совета для используемой мной платы требует, чтобы я использовал сгенерированный файл .cmd вместо того, чтобы создавать свои собственные. (Не создавайте файл, чтобы добавить скрипт, чтобы слить его послесловие.)

Редактировать: Я работаю с TI TMS 6713 DSP с использованием среды Composite 3.1. Карточка, которую я использую, была заключена нашим клиентом и произведена другой организацией, поэтому я не могу указать вам какую-либо информацию об этом. Однако BSP зависит от инструмента конфигурации TSP «DSP BIOS», и я не могу сильно переусердствовать с настройками, не врываясь в нерабочее усилие.

ответ

4

Вам нужно поместить «переменные» в сценарий компоновщика.

В одном из моих проектов у меня есть это в одном из моих разделов:

__FlashStart = .; 

В программе C У меня есть это:

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); 
    } 
} 

Если вы хотите посмотреть только на сегмент .text, вы должны указать strcmp на имя раздела.

Недостаток этого подхода? Libbfd лицензируется в соответствии с GPL, поэтому весь ваш проект будет обременен GPL. Для коммерческого проекта это может быть не стартер.

Если ваш двоичный файл находится в формате ELF, вы можете использовать libelf вместо этого. Я не знаком с тем, как работают API-интерфейсы libelf, поэтому я не могу предоставить пример кода. Linux libelf также является GPL, но я считаю, что проекты BSD имеют свой собственный libelf, который вы могли бы использовать.

Редактировать: Поскольку вы работаете над DSP в минимальной операционной среде в реальном времени, этот ответ не будет работать. Извините, я попробовал.

1

Не могли бы вы уточнить, какой инструмент цепь и архитектура Вас интересует.

на компилятор, я использую прямо сейчас (IAR ARM C/C++) Есть операторы, встроенные в компилятор, возвращающие сегмент начинают адрес __sfb(...) сегмент конечный адрес __sfe(...), и размер сегмента __sfs(...)

1

символы вы ищете являются __text__ и __etext__, которые указывают на начало и конец секции .text соответственно.

Возможно, сгенерированный файл .map полезен, так как в нем перечислены все символы и разделы, определенные в приложении.

Смежные вопросы