avr-ld

Do you have a question? Post it now! No Registration Necessary

Threaded View
Привет All!

    Hедавно столкнулся с очень странным поведением сабжа: при указании ему
-mmcu=atmega128, он упорно пытается разместить секцию .data начиная с адреса
0x80100 независимо от содержимого линкерного скрипта. Этот эффект мне показал
коллега, и мы с ним потратили целый вечер, безуспешно пытаясь уговорить линкер
разместить .data с нужного _нам_ адреса.

    Кто-нибудь может объяснить, что это, зачем и почему? Сабж из комплекта
binutils 2.15.

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Я удалю твою жажду. Без возможности восстановления.

Re: avr-ld
8-Oct-04 00:34 Alex Mogilnikov wrote to All:

AM>     Hедавно столкнулся с очень странным поведением сабжа: при указании
AM> ему
AM> -mmcu=atmega128, он упорно пытается разместить секцию .data начиная с
AM> адреса
AM> 0x80100 независимо от содержимого линкерного скрипта. Этот эффект мне

Угу. Сейчас попробовал - без синхронного указания линкеру
  -Tdata 0x800200
ничего не выходит. Т.е. только в скрипте сказать
  data   (rw!x) : ORIGIN = 0x800200, LENGTH = 0x0E00
не помогает, размещает .data с 0x800100 и потом ругается, что оно не
лезет в регион.

AM>     Кто-нибудь может объяснить, что это, зачем и почему?
 "неисповедимы"...

AM> Сабж из комплекта binutils 2.15.
GNU ld version 2.15 + coff-avr-patch (20030831)

wbr,
--
/* Oleksandr Redchuk, Brovary, Ukraine */
/* real '\x40' real '\x2E' kiev '\x2E' ua     */


Re: avr-ld
Hello Oleksandr.

08 Oct 04 07:46, you wrote to Alex Mogilnikov:

 AM>>     Кто-нибудь может объяснить, что это, зачем и почему?
 OR>  "неисповедимы"...

Все очень просто. -mmcu=atmega128 - это не ключ линкера. Это ключ
драйвера gcc (gcc.exe в виндовсе). Сценарий для работы gcc находится
в файле specs (лежит где-то в районе /lib/gcc-lib/avr/%0.6/specs)

А в нем явно прописано, что для -mmcu=
передавать линкеру ключ -Tdata=0x800100

Сделано это для того, чтобы обойти указанное в дефолтном скрипте (avr5.x)
значение адреса начала сегмента данных равное 0x60, и сделать 0x100.

То есть, если хочется обойти эту проблему то нужно запускать avr-ld вручную, а
не через gcc.

Еще можно попробовать написать скрипт для ld, где данные скидываются
не в секцию ".data", а, например, в ".data1". Может быть тогда эта секция
станет невидима для -Tdata=0x800100;

Alexey


avr-ld
Привет Alexey!

09 Oct 04 13:46, Alexey Boyko писал Oleksandr Redchuk:

 AB> Все очень просто. -mmcu=atmega128 - это не ключ линкера. Это ключ
 AB> драйвера gcc (gcc.exe в виндовсе). Сценарий для работы gcc находится
 AB> в файле specs (лежит где-то в районе
 AB> /lib/gcc-lib/avr/%0.6/specs)

    Спасибо, место локализовано. Теперь бы понять, зачем...

 AB> Сделано это для того, чтобы обойти указанное в дефолтном скрипте
 AB> (avr5.x) значение адреса начала сегмента данных равное 0x60, и сделать
 AB> 0x100.

    Во-первых, зачем обходить прописанное в линкерном скрипте?

    Во-вторых, там написано не 0x100, а 0x800100, в то время как размер
адресного пространства данных всего 0x10000. Чего-то я тут не понимаю...

 AB> То есть, если хочется обойти эту проблему то нужно запускать avr-ld

    Теперь, когда источник проблемы ясен, понятны и способы обхода, и их больше
одного. Осталось лишь непонятным, зачем кто-то намеренно создал проблему,
которую пришлось обходить...

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Программисты знают, что на каждую улицу Пушкина должна быть улица Попкина.

avr-ld
Hello Alex.

09 Oct 04 21:51, you wrote to me:

 AB>> Сделано это для того, чтобы обойти указанное в дефолтном скрипте
 AB>> (avr5.x) значение адреса начала сегмента данных равное 0x60, и
 AB>> сделать 0x100.
 AM>     Во-первых, зачем обходить прописанное в линкерном скрипте?
 AM>     Во-вторых, там написано не 0x100, а 0x800100, в то время как
 AM> размер адресного пространства данных всего 0x10000. Чего-то я тут не
 AM> понимаю...

Вообще-то там прописано 0x800060. По крайней мере у меня.

К адресам прибавлено 0x800000, потому, что gcc/binutils не умеют работать
с несколькими адресными пространствами. Если размещать данные с нуля,
то линкер будет ругаться на перекрытие сегментов или еще хуже. Поэтому
данные смещены на 0x800000. У atmega64/128 ОЗУ начинается не с 0x60, как
указано в скрипте, а с 0x100. Поэтому для этих чипов значение -Tdata
перекрывается значением 0x100.

 AB>> То есть, если хочется обойти эту проблему то нужно запускать
 AB>> avr-ld
 AM>     Теперь, когда источник проблемы ясен, понятны и способы обхода, и
 AM> их больше одного. Осталось лишь непонятным, зачем кто-то намеренно
 AM> создал проблему, которую пришлось обходить...

Hадеюсь теперь понятно объяснил?

Alexey


avr-ld
Привет Alexey!

11 Oct 04 12:13, Alexey Boyko писал Alex Mogilnikov:

 AM>>     Во-первых, зачем обходить прописанное в линкерном скрипте?
 AM>>     Во-вторых, там написано не 0x100, а 0x800100, в то время как
 AM>> размер адресного пространства данных всего 0x10000. Чего-то я тут
 AM>> не понимаю...

 AB> Вообще-то там прописано 0x800060. По крайней мере у меня.

    У меня в specs написано 0x800100.

 AB> К адресам прибавлено 0x800000, потому, что gcc/binutils не умеют
 AB> работать с несколькими адресными пространствами. Если размещать данные
 AB> с нуля, то линкер будет ругаться на перекрытие сегментов или еще хуже.

    Хм. До сих пор линковал программы для avr (90s8515, 90s2313, mega8515),
указывая в скрипте перекрывающиеся регионы (я всегда даю им реальные адреса,
ничего не прибавляя), и никто ни на что не ругался.

 AB> Hадеюсь теперь понятно объяснил?

    Hет, мне понятна тактика, но непонятна стратегия. Hе проще ли было
правильный скрипт линкеру написать? То, что сейчас сделано - это заставить
здорового человека подогнуть ногу и ходить с костылем...

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... О сколько нам открытий чудных готовит открывашки крюк!

avr-ld
Hello Alex.

11 Oct 04 18:39, you wrote to me:

 AB>> Вообще-то там прописано 0x800060. По крайней мере у меня.
 AM>     У меня в specs написано 0x800100.

specs - да. А в линкерном скрипте 0x800060.

 AM>     Хм. До сих пор линковал программы для avr (90s8515, 90s2313,
 AM> mega8515), указывая в скрипте перекрывающиеся регионы (я всегда даю им
 AM> реальные адреса, ничего не прибавляя), и никто ни на что не ругался.

Тогда не знаю.

 AB>> Hадеюсь теперь понятно объяснил?
 AM>     Hет, мне понятна тактика, но непонятна стратегия. Hе проще ли
 AM> было
 AM> правильный скрипт линкеру написать? То, что сейчас сделано - это
 AM> заставить здорового человека подогнуть ногу и ходить с костылем...

А ты спроси Марека Михалкевича и иже с ними. Они же это писали.

Alexey


Site Timeline