Цитата(Сергей Борщ @ Apr 8 2018, 20:05)
Что-то было в документации про overlay, мне не нужно было никогда, я не изучал вопрос глубоко. Может вам подойдет?
Там вот такое написано:
The section definitions within the OVERLAY construct are identical to those within the general SECTIONS construct (see SECTIONS), except that no addresses and no memory regions may be defined for sections within an OVERLAY.No memory regions - значит, VMA изменить не получится, если я правильно понял.
Но я в этом всем плаваю, так что еще остается надежда, что есть какой-то очевидный способ, которого я просто не вижу
ДОПОЛНЕНИЕ:Вроде бы получилось. Последний абзац раздела ld-шной доки про оверлеи натолкнул на мысль.
Еще надо проверять, но в map-файле все выглядит красиво, и вдобавок запускается минимальный пример.
Что сделал:
CODE
.text 0x100000 : AT ( _edata ) { ... }
.bss _edata ( NOLOAD ) : { ... }
_edata - это символ, которому присвоен location counter после конца .data, а 0x100000 - это адрес того блока памяти, куда при старте копируется .text и из которого работает.
В map-файле получилось вот что:
CODE
0x00000000c0000490 _edata = .
...
.text 0x0000000000100000 0x7b58 load address 0x00000000c0000490
...
.bss 0x00000000c0000490 0x128 load address 0x000000017ff00920
...
0xC0000000 - это физический адрес основного блока памяти, из которого стартуем и где остается .data
Похоже, ld-шные ограничения не сработали, так как одна из перекрывшихся по LMA секций оказалась NOLOAD (и чего я мучился - оно с самого начала могло так заработать...).
Синтаксис еще покручу - это только затравка, некрасивый, но приведший к результату пример. Как минимум вместо 0x100000 сделаю нормальное назначение VMA в привычном синтаксисе.
Надеюсь, я по запарке не пропустил чего-то важного - например, не залил при проверке какой-то другой бинарник
Сообщение отредактировал Andrey Vasilyev - Apr 8 2018, 19:51