LINUX.ORG.RU

Непойму в чем разница для линкера


0

0

Вот кусок линкерного скрипта:

[code] .text : { PROVIDE(__text_start = .); /* some stuff */ PROVIDE(__text_end = .); } > text

/* 1 .data : AT (ADDR(.text) + SIZEOF(.text)) */ /* 2 .data : AT (__text_end)*/ { PROVIDE(__data_start = .); /* some stuff */ PROVIDE(__data_end = .); } > data [code]

В 2 закоментированных строчках на мой взгляд написано одно и то-же, но с первой строчкой линковка происходит нормально, со второй - GCC (используемый как линкер) падает.

Дело происходит под виндой, используется AVR-GCC.

В чем может быть проблема?

★★★★

.text : {
  PROVIDE(__text_start = .);
  /* some stuff */
  PROVIDE(__text_end = .);
} > text

/* 1 .data : AT (ADDR(.text) + SIZEOF(.text)) */
/* 2 .data : AT (__text_end)*/
{
  PROVIDE(__data_start = .);
  /* some stuff */
  PROVIDE(__data_end = .);
} > data

alexru ★★★★
() автор топика
Ответ на: комментарий от tailgunner

В каком месте?

Одну из закоментированных строк (из пронумерованных) естественно нужно раскоментировать.

alexru ★★★★
() автор топика
Ответ на: комментарий от tailgunner

Если имеется в виду, что нужно писать без указания адреса вообще, то специально. Регионы text и data находятся по сильно разным логическим адресам, но физически в файле они должны распологаться последовательно.

alexru ★★★★
() автор топика

А ты уверен, что в AT можно использовать символы? По-крайней мере при определении MEMORY region их использовать нельзя, только константы.

Chumka ★★★
()
Ответ на: комментарий от Chumka

Не уверен, просто это работало на старой версии GCC, а на новой сломалось. Оставлю как работает, тем более что в доке так :)

alexru ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.