Как вы получаете указатель на раздел .text? - PullRequest
6 голосов
/ 14 октября 2008

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

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

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

Ответы [ 4 ]

4 голосов
/ 15 октября 2008

Определенно было бы проще, если бы вы могли изменить скрипт компоновщика. Так как вы не можете, возможно извлечь имена разделов, адреса и размеры из двоичного файла программы. Например, вот как можно использовать 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, вы должны указать имя раздела.

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

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

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

4 голосов
/ 15 октября 2008

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

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

  __FlashStart = .;

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

extern unsigned long int _FlashStart;
unsigned long int address = (unsigned long int)&_FlashStart;
1 голос
/ 16 октября 2008

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

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

1 голос
/ 15 октября 2008

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

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

...