On Thu, Oct 17, 2019 at 01:31:57PM +0200, Josef Wolf wrote: > On Wed, Oct 16, 2019 at 12:18:15PM -0600, Martin Sebor wrote: > [ ... ] > The code of Reset_Handler() and memset() actually looks like this: > > void Reset_Handler (void) > { > unsigned long *src = &_sidata > unsigned long *dst = &_sdata > > /* Copy data segment into RAM */ > if (src != dst) { > while (dst < &_edata) > *(dst++) = *(src++); > } > > /* Zero BSS segment */ > dst = &_sbss; > while (dst < &_ebss) > *(dst++) = 0; > > main(); > } > > > I doubt it's the cause of the crash either but only addresses of > > bytes of the same object can be used in relational expressions > > (i.e., the two less-than controlling expressions). > > Hmm, you are talking about the two loops in Reset_Handler(), right? > > > Using address to unrelated objects is undefined. > > Hmmm... I am not an expert on this topic. But I tend to think the BSS segment > is an object, which in turn is an array of uint8_t and/or uint32_t. > Taking the address one past the last element of an array for comparison is > a perfectly valid operation, AFAIK. > > So what would be the proper way to communicate the dimensions of the BSS > segment from the linker to the runtime of the compiled program? I would like to repeat this question: Strictly speaking, the symbols defined by the linker (_sidata, _sdata, _edata, _sbss and _ebss) are unrelated when seen from the perspective of the compiler. Therefore, it is not allowed by the standard to use their addresses for comparison. So what would be the proper way to pass this information from the linker to the compiler? -- Josef Wolf jw@xxxxxxxxxxxxx