Hello Sascha,

On 1/6/26 00:01, Sascha Hauer wrote:
> On Mon, Jan 05, 2026 at 02:11:28PM +0100, Ahmad Fatoum wrote:
>>
>>> With explicit PHDRS directives, we now generate three segments:
>>> 1. text segment (PF_R|PF_X): .text and related code sections
>>> 2. rodata segment (PF_R): .rodata and unwind tables
>>> 3. data segment (PF_R|PF_W): .data, .bss, and related sections
>>
>> Not directly related, but this is as good a place as any to ask the
>> question: How is zero-padding implemented? If the file size is shorter
>> than the memory size, the loader is supposed to zero-fill, which is used
>> for BSS zeroing for example. Now if you load the ELF in place, we can't
>> obviously zero-fill.
> 
> Yes we can, see my other mail. The bss section is placed in the ELF binary,
> unless it is at the very end of the binary in which case it becomes
> smaller by the size of the bss section.

Ok. Can we have a check to verify that no overlap happened? Can also be at
compile-time.

>>> +PHDRS
>>> +{
>>> +   text PT_LOAD FLAGS(5);     /* PF_R | PF_X */
>>> +   rodata PT_LOAD FLAGS(4);   /* PF_R */
>>> +   data PT_LOAD FLAGS(6);     /* PF_R | PF_W */
>>> +   dynamic PT_DYNAMIC FLAGS(6); /* PF_R | PF_W */
>>
>> I believe we don't need PF_W for PT_DYNAMIC. You could move it one up to
>> merge with rodata.
> 
> See readelf output:
> 
> Program Headers:
>   Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
>   LOAD           0x001000 0x00000000 0x00000000 0x96190 0x96190 R E 0x1000
>   LOAD           0x098000 0x00097000 0x00097000 0x4d2f4 0x4d2f4 R   0x1000
>   LOAD           0x0e6000 0x000e5000 0x000e5000 0x216d4 0x283b0 RW  0x1000
>   DYNAMIC        0x0f1d74 0x000f0d74 0x000f0d74 0x15960 0x15960 RW  0x4
> 
> The DYNAMIC segment is inside the LOAD segment directly above. I don't
> know how this segment is really used, but making it readonly means that
> it at least would have to be page aligned which it isn't.

If you add :rodata instead of :data it should merge with .rodata and not require
alignment itself.

>>>     _edata = .;
>>> -   .image_end : { *(.__image_end) }
>>> +   .image_end : { *(.__image_end) } :data
>>>  
>>>     . = ALIGN(4);
>>> -   .__bss_start :  { *(.__bss_start) }
>>> -   .bss : { *(.bss*) }
>>> -   .__bss_stop :  { *(.__bss_stop) }
>>> +   .__bss_start :  { *(.__bss_start) } :data
>>> +   .bss : { *(.bss*) } :data
>>> +   .__bss_stop :  { *(.__bss_stop) } :data
>>
>> Side-effect of having the decompressor take care of zeroing BSS is a big
>> size increase for CONFIG_IMAGE_COMPRESSION_NONE. I think that's
>> acceptable, but it's worth a comment here why we don't have a separate
>> BSS segment (or make bss NOALLOC).
> 
> The bss section is not part of the binary when it's at its very end,
> which it is, so I don't see any size increase.

Very good.

Cheers,
Ahmad

> 
>> FYI, I have patches to get rid of MAX_BSS_SIZE on top of PBL ELF loader
>> support, which I will submit once this support is merged.
> 
> Great \o/
> 
> Sascha
> 


-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

Reply via email to