Hello, I was tried to compile my older project, but LD shows an error : Linking: main/main.elf arm-elf-gcc -mcpu=arm7tdmi -I. -g0 -DROM_RUN -DVECTORS_IN_ROM -D__WinARM__ -Os -ffunction-sections -fdata-sections -Wall -Wcast-align -Wimplicit -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow -Wunused -Wa,-adhlns= startup/Cstartup_source.lst -I....... -fgnu89-inline -MD -MP -MF .dep/............. --output main/main.elf -nostartfiles -Wl,-Map=./main/main.map,--cref,--gc-sections -lc -lm -lc -lgcc -lstdc++ -T./config/AT91SAM7S64-ROM.ld c:/winarm/bin/../lib/gcc/arm-eabi/4.2.2\libgcc.a(unwind-arm.o): In function `get_eit_entry': ../../gcc-4.2.2/gcc/config/arm/unwind-arm.c:464: undefined reference to `__exidx_start' ../../gcc-4.2.2/gcc/config/arm/unwind-arm.c:464: undefined reference to `__exidx_end' collect2: ld returned 1 exit status make: *** [main/main.elf] Error 1 older GCC was compiled fine these sources, but the 4.2.2 is not. How to resolve this ? regards
Do you use a arm-elf or arm-eabi build of the tools. Mind that the latest test-version of WinARM still uses the prefix arm-elf but the included tools are build with the arm-eabi. Please see http://www.embedded.com/columns/technicalinsights/201000339?_requestid=621645 esp. the lines at (29) in Listing 1. Martin Thomas
Ok, I was copied the .ARM.exidx section into my linker script (that
based on your work :-) ). Now, the code has been compiled, but the code
length is zero :\
My linker script :
-----begin:
MEMORY
{
CODE (rx) : ORIGIN = 0x00100000, LENGTH = 256k
DATA (rw) : ORIGIN = 0x00200000, LENGTH = 48k
STACK (rw) : ORIGIN = 0x0020c000,LENGTH = 16k
}
__FIRST_IN_RAM = ORIGIN(DATA);
/* Section Definitions */
SECTIONS
{
/* first section is .text which is used for code */
. = 0x0000000;
.text :
{
KEEP(*(.vectorg))
. = ALIGN(4);
KEEP(*(.init))
*(.text .text.*) /* remaining code */
*(.gnu.linkonce.t.*)
*(.glue_7)
*(.glue_7t)
*(.gcc_except_table)
*(.rodata) /* read-only data (constants) */
*(.rodata.*)
*(.gnu.linkonce.r.*)
. = ALIGN(4);
} >CODE
. = ALIGN(4);
/* .ctors .dtors are used for c++ constructors/destructors */
.ctors :
{
PROVIDE(_ctors_start_ = .);
KEEP(*(SORT(.ctors.*)))
KEEP(*(.ctors))
PROVIDE(_ctors_end_ = .);
} >CODE
.dtors :
{
PROVIDE(_dtors_start_ = .);
KEEP(*(SORT(.dtors.*)))
KEEP(*(.dtors))
PROVIDE(_dtors_end_ = .);
} >CODE
/* .ARM.exidx is sorted, so has to go in its own output section.
*/
.ARM.exidx : {
__exidx_start = .;
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
__exidx_end = .;
} >CODE
. = ALIGN(4);
_etext = . ;
PROVIDE (etext = .);
/* .data section which is used for initialized data */
.data : AT (_etext)
{
_data = . ;
KEEP(*(.vectmapped))
. = ALIGN(4);
*(.fastrun .fastrun.*)
. = ALIGN(4);
SORT(CONSTRUCTORS)
. = ALIGN(4);
*(.data)
*(.data.*)
*(.gnu.linkonce.d.*)
. = ALIGN(4);
} >DATA
. = ALIGN(4);
_edata = . ;
PROVIDE (edata = .);
/* .bss section which is used for uninitialized data */
.bss :
{
__bss_start = . ;
_bss_start_ = . ;
*(.bss)
*(.bss.*)
*(.gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(4);
} >DATA
. = ALIGN(4);
_bss_end_ = . ;
_end = .;
PROVIDE (end = .);
.int_data :
{
*(.internal_ram_top)
} > STACK
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}
------end
Toth Jozsef wrote: > Ok, I was copied the .ARM.exidx section into my linker script (that > based on your work :-) ). Now, the code has been compiled, but the code > length is zero :\ Try to add an ENTRY instruction to your linker-script. See line marked with (3) in the mentioned listing.
Martin Thomas wrote: > Toth Jozsef wrote: >> Ok, I was copied the .ARM.exidx section into my linker script (that >> based on your work :-) ). Now, the code has been compiled, but the code >> length is zero :\ > > Try to add an ENTRY instruction to your linker-script. See line marked > with (3) in the mentioned listing. yes, now works :blush: :-) thank you
Martin Thomas wrote:
> Do you use a arm-elf or arm-eabi build of the tools.
Maybe a silly question but what is the difference.
More detail: Why has it changed?
Cheers, Tilo
Tilo Lutz wrote: > Martin Thomas wrote: >> Do you use a arm-elf or arm-eabi build of the tools. > > Maybe a silly question but what is the difference. > More detail: Why has it changed? The "eabi" has been developed for binary compatibility. So you can use for example a library ("lib-file") created with the Realview tools with in a project which is developed with the arm-eabi GNU toolchain or IAR EWARM 5.x and vice versa. A lot of information on the eabi can be found on arm.com. The current WinARM test-release (11/07) is a eabi-build which still uses the arm-elf prefix to keep compatibility with older makefiles. It's just for testing. My long-term plan (read: if I will ever have enough time) is to modify and test all examples in the WinARM example-collection for/with eabi so they can also be built with other precompiled arm-eabi GNU toolchains like for example DevKitARM or Codesourcery's "G++ ARM lite". There are too many precompiled packages out there with small differences. I think it's a good idea to get some common base so any example created for a "bare metal" GNU ARM toolchain can be build with any precompiled toolset. So it doesn't matter if the user has DevkitARM, Sourcery G++, Idealist, Yagarto, GNUARM, Ride, Crossworks, WinARM or whatever installed. I hope that the change to eabi is one step in this direction.
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.