Dear Albert ARIBAUD, >> I try to understand how the relocation process could handle pointers (to >> functions or other data) in const or data sections. >> Your code cannot know what is data and what is a pointer that needs >> adjustment? >> >> Best Regards, >> Reinhard > > Hi Reinhart, > > Short answer - the relocation process does not handle pointers inside > data structures. > > And yes, this means the content arrays of pointers such as init_sequence > is not relocated. Been there, done that, can give you one of the > tee-shirts I got :) > > ATM I have not found a way to fix this, except making the code which > uses the pointers aware that the are location-sensitive and fix them > when using them.
That means that things like this cannot work (with relocation), unless adding the relocation offset before using the pointer: const struct { const u8 shift; const u8 idcode; struct spi_flash *(*probe) (struct spi_slave *spi, u8 *idcode); } flashes[] = { #ifdef CONFIG_SPI_FLASH_SPANSION { 0, 0x01, spi_flash_probe_spansion, }, #endif #ifdef CONFIG_SPI_FLASH_ATMEL { 0, 0x1F, spi_flash_probe_atmel, }, #endif #ifdef CONFIG_SPI_FLASH_MACRONIX { 0, 0xc2, spi_flash_probe_macronix, }, #endif #ifdef CONFIG_SPI_FLASH_WINBOND { 0, 0xef, spi_flash_probe_winbond, }, #endif #ifdef CONFIG_SPI_FLASH_STMICRO { 0, 0x20, spi_flash_probe_stmicro, }, { 0, 0xff, spi_flash_probe_stmicro, }, #endif #ifdef CONFIG_SPI_FLASH_SST { 0, 0xBF, spi_flash_probe_sst, }, #endif #ifdef CONFIG_SPI_FRAM_RAMTRON { 6, 0xc2, spi_fram_probe_ramtron, }, # ifdef CONFIG_SPI_FRAM_RAMTRON_NON_JEDEC { 0, 0xff, spi_fram_probe_ramtron, }, # endif # undef IDBUF_LEN # define IDBUF_LEN 9 /* we need to read 6+3 bytes */ #endif }; And I think there are more places of this type in u-boot... Best Regards, Reinhard _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot