JustGreg
JustGreg

Reputation: 241

GCC ARM linker error - undefined reference to 'strcmp'

I have a TIVA-C microcontroller project, compiled with arm-none-eabi-gcc and although I added string.h I'm getting 'undefined reference to strcmp' linker error. I'm using the precompiled toolchain: gcc-arm-none-eabi-4_8-2014q3-20140805-linux.tar.bz2 from here: https://launchpad.net/gcc-arm-embedded/+download. My makefile switches:

# define flags
CFLAGS = -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
CFLAGS +=-Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall
CFLAGS += -pedantic -DPART_$(MCU) -c -I$(TIVAWARE_PATH)
CFLAGS += -DTARGET_IS_BLIZZARD_RA1
LDFLAGS = -T $(LD_SCRIPT) --entry ResetISR --gc-sections

There were others with the same problem but they've the -nostd switch on in the LDFLAGS what I apparently don't have. I'm out of ideas now, so any tip would be great.

Upvotes: 1

Views: 7749

Answers (2)

Freddie Chopin
Freddie Chopin

Reputation: 8870

The problem happens because you use -ld for linking directly. As a multilib toolchain, arm-none-eabi has multiple variants of libc.a (which contains the function you need) and other standard libraries. -ld just cannot find the right libraries.

To solve your problem, modify your makefile in following places:

Replace:

# define flags
CFLAGS = -g -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
CFLAGS +=-Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall
CFLAGS += -pedantic -DPART_$(MCU) -c -I$(TIVAWARE_PATH)
CFLAGS += -DTARGET_IS_BLIZZARD_RA1
LDFLAGS = -T $(LD_SCRIPT) --entry ResetISR --gc-sections

with:

# define flags
COREFLAGS = -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp
CFLAGS = -g $(COREFLAGS)
CFLAGS +=-Os -ffunction-sections -fdata-sections -MD -std=c99 -Wall
CFLAGS += -pedantic -DPART_$(MCU) -c -I$(TIVAWARE_PATH)
CFLAGS += -DTARGET_IS_BLIZZARD_RA1
LDFLAGS = $(COREFLAGS) -T$(LD_SCRIPT) -Wl,--entry=ResetISR,--gc-sections

Replace:

LD = arm-none-eabi-ld

with:

LD = arm-none-eabi-g++

The idea is simple - to the linking stage you pass all the options that are relevant to the architecture (everything that starts with -m), and the options for linker are prefixed with -Wl,, multiple linker options can be concatenated with commas, without the need to repeat the -Wl, prefix. No prefix is needed for -T, -L and -l.

You can also check out my example ARM projects, which include a quite nice Makefile - I never had any library issues with that. On my website (link in profile) go to Download > ARM > Examples, and pick which one you like - there's no example for tiva, but the one for STM32F4 will be the closest match.

Upvotes: 6

Brian Sidebotham
Brian Sidebotham

Reputation: 1906

As you're using an embedded toolchain, it likely doesn't link to libc without you instructing it to. add -lc to your LDFLAGS to see if it solves the problem as this will at least attempt to link to libc.

Upvotes: 1

Related Questions