Egyeb otlet?
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.
A limitaciok miatt a teljes zubehor, init-estul, text-estul, rodata+data+bss-estul egyetlen RAM blokkba kerul, onnan is fut
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? Ha az align-t leveszed 8-ra, akkor még a kihasználatlan memóriaterület is minimális lesz a :text és :data szegmens között, nem veszítesz semmit. Init, text rodata sections megy a :text szegmensbe, data, bss meg a :data szegmensbe, a két szegmens meg egymásután a RAM-ba (úgyis csak az első szegmens kezdőcíme az érdekes, ha jól sejtem).
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:
SECTIONS { . = SEGMENT_START("text-segment", KEZDOCIM) + SIZEOF_HEADERS; .text . : { ... } :text ...
Ha nem akarod, hogy a programfejléc is benne legyen, akkor hagyd ki a SIZEOF_HEADERS-t. Ez akkor kell, ha az elf egy-az-egyben töltődik be a memóriába (azaz az elf fájl első bájtra kerül arra címre), és akkor nem kell, ha a kódszegmens első bájtja kerül arra a címre (vagy azért, mert kraftos az elf betöltő, vagy pedig azért, mert linkelés után objconv-val raw binary-vá alakítod). Hogy kell-e, azon múlik, hogy töltöd be végül.
Nagyon fontos, a szekció definícónál van egy PLUSZ PONT (a ".text" és a kettőspont között), ez helyezi el az adott címre, azaz ez a pont váltja ki a MEMORY-t és a kacsacsőrt.