Symbol <symbolname> multiply defined (by <object1> and <object2>).
A common example where this occurs:
Symbol __stdout multiply defined (by retarget.o and stdio.o).
means that there are two conflicting definitions of __stdout
present in retarget.o
and stdio.o
. The one in retarget.o
is your own definition. The one in stdio.o
is the default implementation, which was probably linked-in inadvertently.
stdio.o
contains a number symbol definitions and implementations of file functions like fopen
, fclose
, and fflush
.
stdio.o
is being linked-in because it satisfies some unresolved references.
To identify why stdio.o
is being linked-in, you must use the verbose
link option switch. For example:
armlink [... your normal options...] --verbose --list err.txt
Then study err.txt
to see exactly what the linker is linking in, from where, and why.
You might have to either:
-
eliminate the calls like
fopen
,fclose
, andfflush
-
re-implement the
_sys_xxxx
family of functions.
See the section Tailoring the input/output functions in the RVCT Libraries and Floating Point Support Guide.