Propagating addresses from linker to the runtie (was: Re: Crash when cross compiling for ARM with GCC-8-2-0 and) -ftree-loop-distribute-patterns
Josef Wolf
jw@raven.inka.de
Fri Oct 18 09:10:00 GMT 2019
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@raven.inka.de
More information about the Gcc-help
mailing list