Почему скрипт компоновщика имеет несколько команд секций? - PullRequest
2 голосов
/ 11 апреля 2019

Я читал документацию для ld , но что-то не понятно.

С учетом скрипта частичного компоновщика:

MEMORY
{
  FLASH1 (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
  FLASH2 (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
}

SECTIONS
{
  .some_code :
  {
    KEEP(*(SORT(.some_code*)))
  } > FLASH1
}
SECTIONS
{
  .my_page :
  {
    KEEP(*(SORT(.my_page*)))
  } > FLASH2
}

Есть ли причина иметь две команды секции в одном скрипте компоновщика, как указано выше, вместо того, чтобы иметь все команды в одной секции, как показано ниже?

SECTIONS
{
  .some_code :
  {
    KEEP(*(SORT(.some_code*)))
  } > FLASH1
  .my_page :
  {
    KEEP(*(SORT(.my_page*)))
  } > FLASH2
}

Или они эквивалентны. Есть ли другие случаи, когда вы хотели бы разделить это так?

Дополнительные пояснения: я прошу причину иметь отдельные команды "РАЗДЕЛЫ" (каждая со своим собственным блоком определений разделов), не спрашивая причину наличия отдельных разделов в целом.

1 Ответ

2 голосов
/ 14 апреля 2019

Нет необходимости в написании более одной команды SECTIONS или MEMORY в сценарии компоновщика.

SECTIONS
{
    /* Commands... */
}
SECTIONS
{
    /* More commands... */
}

эквивалентно:

SECTIONS
{
    /* Commands... */
    /* More commands... */
}

и аналогично для MEMORY.

Тем не менее, поддерживаемость нетривиального тела сценариев-компоновщиков поддерживается, если сценарий компоновщика может включать несколько SECTIONS илиMEMORY команд.Например, если:

foobar.lds (1)

MEMORY
{
    FOOMEM (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
    BARMEM (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
}

SECTIONS
{
    .foo : {
        *(.foo)
    } > FOOMEM
    .bar : {
        *(.bar)
    } > BARMEM
}

были чем-то гораздо менее тривиальным, чем оно есть, лучше было бы реорганизовать его следующим образом:

foobar.lds (2)

INCLUDE ./foo.lds
INCLUDE ./bar.lds

foo.lds

MEMORY
{
    FOOMEM (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
}

SECTIONS
{
    .foo : {
        *(.foo)
    } > FOOMEM
}

bar.lds

MEMORY
{
    BARMEM (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
}

SECTIONS
{
    .bar : {
        *(.bar)
    } > BARMEM
}

, чтобы компоновщик foobar.lds (2) расширялся до

foobar.lds (3)

MEMORY
{
    FOOMEM (rx) : ORIGIN = 0x000FB000, LENGTH = 0x05000
}

SECTIONS
{
    .foo : {
        *(.foo)
    } > FOOMEM
}

MEMORY
{
    BARMEM (r) : ORIGIN = 0x000FA000, LENGTH = 0x01000
}

SECTIONS
{
    .bar : {
        *(.bar)
    } > BARMEM
}

Историческая справка: В этом устаревшем руководстве GNU ld из давно минувших дней мы можем найти ограничения:

Вы можете использовать не более одного РАЗДЕЛАкоманды в файле сценария, но вы можете иметь в ней столько операторов, сколько пожелаете.

и:

Файл команды может содержать не более одного использованияКоманда ПАМЯТЬ;однако вы можете определить столько блоков памяти внутри него, сколько пожелаете.

, которые отсутствуют в текущего руководства .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...