
On 6/15/21 8:33 AM, Kunihiko Hayashi wrote:
If both POSITION_INDEPENDENT and SYS_RELOC_GD_ENV_ADDR are enabled, wherever original env is placed anywhere, it should be relocated to the right address.
Relocation offset gd->reloc_off is calculated with SYS_TEXT_BASE in setup_reloc() and env address gd->env_addr is relocated by the offset in initr_reloc_global_data().
gd->env_addr = (orig env) + gd->reloc_off = (orig env) + (gd->relocaddr - SYS_TEXT_BASE)
However, SYS_TEXT_BASE isn't always runtime base address when POSITION_INDEPENDENT is enabled. So the relocated env_addr might point to wrong address. For example, if SYS_TEXT_BASE is zero, gd->env_addr is out of memory location and memory exception will occur.
There is a difference between linked address such as SYS_TEXT_BASE and runtime base address. In _main, the difference is calculated as "run-vs-link" offset. The env_addr should also be added to the offset to fix the address.
gd->env_addr = (orig env) + ("run-vs-link" offset) + gd->reloc_off = (orig env) + (SYS_TEXT_BASE - _start) + (gd->relocaddr - SYS_TEXT_BASE) = (orig env) + (gd->relocaddr - _start)
Cc: Marek Vasut marex@denx.de Signed-off-by: Kunihiko Hayashi hayashi.kunihiko@socionext.com
Thank you for debugging and fixing this properly.
Acked-by: Marek Vasut marex@denx.de Tested-by: Marek Vasut marex@denx.de
I did manage to reproduce it on RCar3, and this patch fixes the crash on boot indeed.
Tom, it would be good to include it in this release too.