Как сделать раздел в формате ELF только для чтения с GNU GAS? - PullRequest
2 голосов
/ 31 января 2011

Насколько я понимаю, это директивы .section:

awxMSGT

«Старые» директивы, если использовался формат COFF, имели «только чтение».

Как сделать раздел в формате ELF только для чтения? Нет спецификатора вообще?

Ответы [ 2 ]

3 голосов
/ 31 января 2011

Да, пустые флаги делают его доступным только для чтения (любые флаги без явного w для записи делают его доступным только для чтения), что можно проверить, например, используя objdump .Итак, .section foo или .section bar, "" оба создают раздел только для чтения.Вы, вероятно, хотите сделать его размещаемым, поэтому что-то вроде .section baz, "a".Это также, кажется, автоматически включает @progbits (отмечен LOAD в objdump) для фактического чтения данных из файла в память.Вы также можете указать, что вручную, чтобы быть на безопасной стороне.Подробнее см. Документацию GAS .

1 голос
/ 31 января 2011

РЕДАКТИРОВАТЬ: Взглянув на информацию о GNU AS, я отвечаю на то, что я написал ниже.Я почти уверен, что так же, как в моем примере скрипта компоновщика, пропуская "w", вы отметите этот раздел как недоступный для записи.Звучало правильно, поэтому я попробовал!

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

Например:

MEMORY
{
    flash (rx)  : org = 0x00000000 , len = 0x00080000
    sram  (rwx) : org = 0x40000000 , len = 0x00010000
}

Тот факт, что я исключил букву "w" из своего сегмента флэш-памяти, означает, что он доступен только для чтения.Затем в спецификации раздела позже я использую:

SECTIONS
{
    /* .text section (executable code) */
    .text :
    {
        blah blah blah
    } > flash
    _etext = . ;
    PROVIDE ( etext = . );

    /* .data section (read/write initialized variables) */
    .data : AT (_etext)
    {
        blah blah blah
    } > sram
}

Я указываю, где каждый раздел хранится в памяти в спецификации раздела с помощью> flash или> sram, чтобы определить, находится ли он в памяти только для чтения или нет (и "AT (_etext)" указывает, что он запускается только для чтения и копируется позже).

Я знаю, что вы специально спрашивали об ассемблере, но это звучало так, как я и думал.

Надеюсь, это поможет!

...