Hi!
I’m using YAGARTO + Eclipse, and have no problem compiling code without
standard libs, but have them with… For example following code gives an
error:
#include <string.h>
int main(void)
{
char a[10];
char b[10];
strcpy(a,b);
}
> Linking...
arm-elf-ld -v -Map main.map -Tlpc2378.ld -o main.out main.o
GNU ld (GNU Binutils) 2.18
main.o: In function `main':
test06/main.c:9: undefined reference to `strcpy'
make: *** [main.out] Error 1
My makefile looks like:
NAME = lpc2378
CC = arm-elf-gcc
LD = arm-elf-ld -v
AR = arm-elf-ar
AS = arm-elf-as
CP = arm-elf-objcopy
OD = arm-elf-objdump
CFLAGS = -I./ -c -fno-common -O0 -g
AFLAGS = -ahls -mapcs-32 -mapcs-stack-check
LFLAGS = -Map main.map -Tlpc2378.ld
CPFLAGS = -O binary
HEXFLAGS = -O ihex
ODFLAGS = -x --syms
all: test
test: main.out
@ echo "> Copying.."
$(CP) $(CPFLAGS) main.out main.bin
$(OD) $(ODFLAGS) main.out > main.dmp
@echo "> Building hex"
$(CP) $(HEXFLAGS) main.out main.hex
@ echo "> Sorting output..."
@ mv *.o *.lst *.dmp *.hex *.map *.out *.bin out
main.out: main.o lpc2378.ld
@ echo "> Linking..."
$(LD) $(LFLAGS) -o main.out main.o
clean:
@ echo "Cleaning..."
@ rm ./out/*.*
Any suggestions please
Dmitry Timas wrote: >> Linking... > arm-elf-ld -v -Map main.map -Tlpc2378.ld -o main.out main.o > GNU ld (GNU Binutils) 2.18 > main.o: In function `main': > test06/main.c:9: undefined reference to `strcpy' > make: *** [main.out] Error 1 Here your linker command line shows that you have not linked any libraries. If you call the linker directly, you have to specify the standard libraries and their paths. To add to the complexity, there are multiple versions of the standard library depending on the target for Thumb, ARM, Interwork, FPA support etc. I believe that the simplest solution is to invoke the linker indirectly through the compiler front end (arm-elf-gcc or arm-elf-g++). This implicitly determines the correct libraries from the compiler options. Otherwise you need some appropriate -L<path> arguments, and at least -lc and -lgcc (in that order), and possibly -lm ahead of those if using the math library. Clifford
If you do wish to call arm-elf-ld directly, something like the following: LFLAGS = -Map main.map -Tlpc2378.ld -L$(YAGARTO_TOOLS_ROOT)/lib/gcc/arm-elf/4.0.2/interwork -L$(YAGARTO_TOOLS_ROOT)/arm-elf/lib/interwork -nostdlibs --start-group -lc -lm -lgcc --end-group works for me. Note you may want to select something other than teh interwork libraries, but these give the widest compatibility at the expense of very slightly larger code size. Also not that the use of YAGARTO_TOOLS_ROOT. Either set this as an environment variable or a macro within the makefile, or replace directly wit the path for your installation. The -start-group/-end-group may not be strictly necessary. It avoids any issues with link order and dependencies at the possible cost of increased build time but in post circumstances this is insignificant. Clifford
Clifford Slocombe wrote: > I believe that the simplest solution is to invoke the linker indirectly > through the compiler front end (arm-elf-gcc or arm-elf-g++). This > implicitly determines the correct libraries from the compiler options. > Otherwise you need some appropriate -L<path> arguments, and at least -lc > and -lgcc (in that order), and possibly -lm ahead of those if using the > math library. > Very good explanation, thank you very much! As you suggested I used front end (arm-elf-gcc) & Martin’s makefile, works fine for me till now!
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.