[U-Boot-Users] Why are some global vars part of the image, and some not?

Timur Tabi timur at freescale.com
Fri Nov 3 22:58:29 CET 2006

I have the following code in one of my files:

static volatile unsigned int i2c_bus_num = CFG_SPD_BUS_NUM;
static volatile unsigned int i2c_bus_num = 0;

static volatile struct fsl_i2c *i2c_dev[2] = {
	(struct fsl_i2c *) (CFG_IMMR + CFG_I2C_OFFSET),
#ifdef CFG_I2C2_OFFSET
	(struct fsl_i2c *) (CFG_IMMR + CFG_I2C2_OFFSET)

As you can see, I defined two static volatile global vars: i2c_bus_num and 

My U-Boot image is 0x294E0 bytes in size, and it's located at address 
0xFE000000.  When I run U-Boot, the address of i2c_bus_num is 0xfe02a114, and 
the address of i2c_dev[] is 0xfe028124.

In other words, i2c_dev[] is part of the actual U-Boot image, but i2c_bus_num, 
which is defined right next to it, isn't.  This means that i2c_dev[] is 
properly initialized, but i2c_bus_num is set to 0xFFFFFFFF (the value that 
erased flash has).

How is this possible?  How can two adjacent global variables be located is 
completely different memory segments?

Timur Tabi
Linux Kernel Developer @ Freescale

More information about the U-Boot mailing list