2013-04-29 2 views
2

Большинство программ сборки ARM, с которыми я сталкиваюсь, используют директивы .data и .text. Тем не менее, я заметил две вещи:Требуется ли текст и .data в сборке ARM?

  1. Много раз сборочный код, сгенерированный самим GCC компилятор будет использовать только .text директиву, группировка переменных где-то в коде без .data директивы.

  2. Даже если я не использую раздел .text, мои программы все еще компилируются и работают нормально.

Мой вопрос: необходимы эти директивы? Если да, то почему? Если да, то как мои программы по-прежнему работают без них?

+1

Вы уверены, что ** переменные ** gcc-группы не являются ** константами **? Это иногда называют «.rodata» и т. Д. Эти разделы являются довольно стандартными, как '.bss'. Как отмечает Этьен, ваш * линкер * и ОС (или отсутствие) определяют, нужны они или нет. Например, с Linux, который анализирует файл * Elf *, они понадобятся. Для приложения * bare metal * вы можете вызывать разделы, которые вам нравятся, если они соответствуют нотации компоновщика. –

ответ

3

Иногда необходимо использовать эти директивы раздела, когда вы хотите решить, где разместить разделы, которые вы определили, когда вы передаете свою программу и где они выполняются, в ПЗУ, в ОЗУ и т. Д. Затем вы можете написать свой собственный компоновщик сценарий, как в следующем примере (в формате сценария ld линкера):

MEMORY 
{     
     RAM (rw) : ORIGIN = 0x00000000, LENGTH = 128M    
     ROM (rx) : ORIGIN = 0xffff0000, LENGTH = 64K  
}      

SECTIONS    
{     
    .startup : 
    {    
     *(.text.vectors) 
     sdram_init.o(.sdram_init) 
     main.o(.text_main) 
    } > ROM                 

    .data : 
    {  
     *(.data*) 
    } > RAM 
} 

Если вы используете поведение компоновщика по умолчанию я не думаю, что вам нужно будет явно объявлять разделы с директивами.