Reply by Tauno Voipio April 18, 20062006-04-18
justincui@gmail.com wrote:
> Hi, > how to know the value of the variables defined in link script file? > for example, the following is the target.ld in ecos, could anybody know > how to extract the __xxxx values from the generated ELF file? > ============== start of target.ld===================== > STARTUP(vectors.o) > ENTRY(__exception_reset) > > INPUT(extras.o) > > > GROUP(libtarget.a libgcc.a libsupc++.a) > MEMORY > { > ram : ORIGIN = 0, LENGTH = 0x400000 > } > > SECTIONS > { > > __reserved_vectors = 0; > . = __reserved_vectors + 0x3000; > > __reserved_vsr_table = ALIGN (0x10); > . = __reserved_vsr_table + 0x200; >
(-- rest clipped, TV --) If the linker is GNU ld, the symbols defined in the linker script are available as external addresses to the code. (Did you read the ld manual?) -- Tauno Voipio tauno voipio (at) iki fi
Reply by April 18, 20062006-04-18
Hi,
    how to know the value of the variables defined in link script file?
for example, the following is the target.ld in ecos, could anybody know
how to extract the __xxxx values from the generated ELF file?
============== start of target.ld=====================
STARTUP(vectors.o)
ENTRY(__exception_reset)

INPUT(extras.o)


GROUP(libtarget.a libgcc.a libsupc++.a)
MEMORY
{
    ram : ORIGIN = 0, LENGTH = 0x400000
}

SECTIONS
{

    __reserved_vectors = 0;
 	. = __reserved_vectors + 0x3000;

    __reserved_vsr_table = ALIGN (0x10);
 	. = __reserved_vsr_table + 0x200;

    __reserved_virtual_table = ALIGN (0x10);
 	. = __reserved_virtual_table + 0x100;

    __reserved_for_rom = ALIGN (0x10);
 	. = __reserved_for_rom + 0x1cd00;

    .vectors ALIGN (0x10) : {
		. = .;
 		KEEP(*(.vectors))
	} > ram

	.text ALIGN (0x4) : {
		_stext = .;
 		*(.text*)
		*(.gnu.warning)
		*(.gnu.linkonce*)
		*(.init)
	} > ram
	_etext = .;
 	PROVIDE (etext = .);

    .fini ALIGN (0x4) : {
		. = .;
 		*(.fini)
	} > ram

	.rodata1 ALIGN (0x8) : {
		. = .;
 		*(.rodata1*)
	} > ram

	.rodata ALIGN (0x8) : {
		. = .;
 		*(.rodata*)
	} > ram

	.fixup ALIGN (0x4) : {
		__FIXUP_START__ = ABSOLUTE(.);
 		*(.fixup) __FIXUP_END__ = ABSOLUTE(.);
	} > ram

	.gcc_except_table ALIGN (0x1) : {
		__EXCEPT_START__ = ABSOLUTE(.);
 		*(.gcc_except_table)
		__EXCEPT_END__ = ABSOLUTE(.);
	} > ram

	.data ALIGN (0x8) : {
		__ram_data_start = ABSOLUTE(.);
 		*(.data*)

		__GOT1_START__ = ABSOLUTE(.);
 		*(.got1)
		__GOT1_END__ = ABSOLUTE(.);

		. = ALIGN(8);
 		__CTOR_LIST__ = ABSOLUTE(.);
 		KEEP(*(SORT(.ctors*)))
		__CTOR_END__ = ABSOLUTE(.);

 		__DTOR_LIST__ = ABSOLUTE(.);
 		KEEP(*(SORT(.dtors*)))
		__DTOR_END__ = ABSOLUTE(.);

 		. = ALIGN(8);
 		KEEP(*( SORT (.ecos.table.*))) ;

 		. = ALIGN(4);
 		*( .2ram.*) ;
 		__GOT2_START__ = ABSOLUTE(.);
 		*(.got2)
		__GOT2_END__ = ABSOLUTE(.);

 		__GOT_START = ABSOLUTE(.);
 		_GLOBAL_OFFSET_TABLE_ = ABSOLUTE(. + 32768);
		_SDA_BASE_ = ABSOLUTE(.);
 		*(.got.plt)
		*(.got)
		__GOT_END__ = ABSOLUTE(.);

		*(.dynamic)
		*(.eh_frame)
		__SDATA_START__ = ABSOLUTE(.);
 		*(.sdata)
		*(.sdata.*)
		__SDATA2_START__ = ABSOLUTE(.);

		*(.sdata2*)
	} > ram
	__rom_data_start = LOADADDR(.data);
 	__ram_data_end = .;
 	PROVIDE(__ram_data_end = .);
 	_edata = .;
 	PROVIDE (edata = .);

    .sbss ALIGN (0x4) : {
		__sbss_start = ABSOLUTE (.);
 		__SBSS_START__ = ABSOLUTE(.);
		 *(.sbss.*)
		__SBSS_END__ = ABSOLUTE(.);
 		__SBSSx_START__ = ABSOLUTE(.);
 		*(.sbss*)
		__SBSSx_END__ = ABSOLUTE(.);
 		*(.scommon*)
		__sbss_end = ABSOLUTE (.);
 	} > ram

    .bss ALIGN (0x10) : {
		__bss_start = ABSOLUTE (.);
 		. = .;
 		*(.dynbss*)
		*(.bss*)
		*(COMMON)
		__bss_end = ABSOLUTE (.);
 	} > ram
    __heap1 = ALIGN (0x8);

    . = ALIGN(4);
 	_end = .;
 	PROVIDE (end = .);

}
hal_vsr_table = (0x0 + 0x3000);

hal_virtual_vector_table = ((0x0 + 0x3000) + 0x200);
======================= end of target.ld ========================