( apal | 2025. 03. 09., v – 18:32 )

Régen kellett ilyesmi, akkor az ld "-N" kapcsolója megoldotta ezt. Nem tudom, hogy a legújabb verziónál is működik-e még ez a workaround.

Igen, a `man ld` szerint valami hasonlot kene csinalnia, de itt sajna nem segit :/ Kb ugy hatastalan mint a (READONLY) cucc. 

Egyébként ha úgyis linker scriptből helyezed a RAM-ba a szegmenseket, akkor miért nem használsz két egymásutáni szegmenst és jóccakát? 

Igyis automatikusan egymas utan helyezi el, ezzel nincs gond:

20000000 T __text_start
2000005c T __vectors
[...]
200012a4 T __modsi3
200012f4 T __text_end
200012f8 A __data_source
200012f8 D __bss_start
200012f8 D __data_start
200012f8 D __tls_base
20001af8 D __global_pointer$
200028c8 B __bss_end
20020000 T __stack

Raadasul pont 8-ra alignolva, ahogy mondod, ez van a default linker scriptben is :)

A gond inkabb az hogy tenyleg csak egy MEMORY blokk van:

MEMORY
{
    ram(rwx): ORIGIN = DEFINED(__ram  ) ? __ram   : 0x20000000, LENGTH = DEFINED(__ram_size  ) ? __ram_size   : 0x08000
}

Es ezt elso korben megtartanam igy hogy tukrozze a bus_matrix strukturajat ahogy azt hardveresen kialakitottam. Olyat persze lehetne hogy felosztom igy jelkepesen ket reszre ezt a 0x20000000 <= ... < 0x20020000 tartomanyt, az also az (rx), a felso az (rw) es akkor szevasz. De akkor pont a flexibilitasat vesztem el: neha az kell hogy sok program + keves ram, neha kis program tobb memoriat enne, es akkor folyamatosan mozgatni kene a hatarokat. Nem olyan sok az a 128k... 

Másik ötlet, hagyd a francba a MEMORY blokkot, helyette a szegmens kezdőcímét állítsd be, a végeredmény ugyanaz lesz:

Koszi, ezt megnezem, ezt nem ismertem. Ha ez igy flexibilis marad (nem kell kezzel allitgatnom a hatarokat) akkor kb jo is lehet :)