[U-Boot] Problems with Linker Symbols to make HAB on i.MX28 work
Christopher Preschern
christopher.preschern at tugraz.at
Fri Apr 26 07:46:44 CEST 2013
Hi,
I want to make High Assurance Boot (HAB) for the Freescale i.MX28 with
U-Boot 04/2012 work. To do that I have to link an Image Vector Table
(IVT, consists of some boot image addresses which I insert by using
linker symbols in the C-code) to the u-boot binary. My problem is, that
the linker symbols are not inserted into the binary correctly (they
always have the value 0).
Here is my code - I include the following to board/denx/m28evk/m28evk.c
/*IVT DEFINITION */
#define BASE_ADDRESS 0x00000100
extern unsigned int __hab_uboot_data; // defined in u-boot.lds
extern int __hab_uboot_end; // defined in u-boot.lds
extern void* _start;
struct my_ivt { // IVT structur according to
uint32_t header; // some Freescale manuals
uint32_t *entry;
uint32_t reserved1;
uint32_t *dcd;
uint32_t *boot_data;
uint32_t *self;
uint32_t *csf;
uint32_t reserved2;
uint32_t img_len;
};
const struct my_ivt input_ivt
__attribute__((section(".ivt"),aligned(4))) = {
0x402000d1 //header
(uint32_t*) (&_start), //entry
0, //reserved
NULL, //DCD
NULL, //boot data
(uint32_t*) (&input_ivt), //IVT address
(uint32_t*) (&__hab_uboot_data), //CSF
0, //reserved
(uint32_t) (&__hab_uboot_end) - BASE_ADDRESS //image length
};
/*END OF IVT DEFINITION*/
and I modify the linker file (arch/arm/cpu/u-boot.lds)
/*INSERTED RIGHT BEFORE THE BSS SECTION */
. = ALIGN(4);
__uboot_ivt = .;
.ivt : { *(.ivt) }
__hab_uboot_data = .;
. = . + 0x2000;
__hab_uboot_end = .;
With this code, the IVT should be written to the end of u-boot.bin.
When looking at it with a hex-Editor I do see the IVT (e.g. the
hard-coded header is there - in little-endian), but the values for the
linker symbols (e.g. __hab_uboot_data) are 0.
D1002040 00010040 00000000 00000000
00000000 00900640 00000000 00000000
00FFFFFF
However, I think that the linker symbols are correctly included in the
C-source, because the compiler does not complain that he cannot find the
extern __hab_uboot_data variable and in all the forums/tutorials I
googled I found the syntax I use. Also if I put
printf("HAB-DEBUG: %x \n",(uint32_t)(&__hab_uboot_end));
somewhere in the code (e.g. into the board_init() in m28evk.c), I do get
an address which is not 0 (although it is also not the address I expect
– I get the expected address + the U-Boot relocation offset)
I appreciate any kind of help very much!
Best regards,
Christopher
More information about the U-Boot
mailing list