Problem to resolve "sqrt" symbol from shell/main_ping.c for lpc17xx_ea_ram BSP

Pavel Pisa ppisa4lists at pikron.com
Thu Oct 2 01:57:57 UTC 2014


Hello all,

when have tested recent master branch (fbe59f7c6756edc2952b13167893b85fe6e7aecb)
build configured for lpc17xx_ea_ram BSP, I am experiencing next error for my
code with networking enabled. It seems to be related to add of ping command.

Even addition of -lm to my LDFLAGS does not help

GCC call from OMK based makefile

arm-rtems4.11-gcc --pipe -B/opt/rtems4.11/arm-rtems4.11/lpc17xx_ea_ram/lib/ \
  -specs bsp_specs -qrtems -march=armv7-m -mthumb \
  -I /home/pi/repo/rtems/build/arm-lpc17xx_ea_ram/omk-template/_compiled/lpc17xx_ea_ram/include \
  -Wall -O2 -g init.o task_1.o \
  -L/home/pi/repo/rtems/build/arm-lpc17xx_ea_ram/omk-template/_compiled/lpc17xx_ea_ram/lib \
  -lbar -lnfs -lm  -o /home/pi/repo/rtems/build/arm-lpc17xx_ea_ram/omk-template/_compiled/lpc17xx_ea_ram/bin/appnet

Error reported

/opt/rtems4.11/arm-rtems4.11/lpc17xx_ea_ram/lib/librtemscpu.a(libshell_a-main_ping.o): In function `g_finish':
/home/pi/repo/rtems/build/arm-lpc17xx_ea_ram/rtems/arm-rtems4.11/c/lpc17xx_ea_ram/cpukit/libmisc/../../../../../../../../git/rtems/c/src/../../cpukit/libmisc/shell/main_ping.c:1642: 
undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
make[3]: *** [/home/pi/repo/rtems/build/arm-lpc17xx_ea_ram/omk-template/_compiled/lpc17xx_ea_ram/bin/appnet] Error 1
make[2]: *** [binary-pass-this-dir] Error 2
make[1]: *** [binary-pass-appnet-subdir] Error 2
make: *** [binary-pass] Error 2

I have investigated how collect is called and even tried to modify it by adding libm.a

/usr/arm-rtems4.11/gcc/4.9.1/bin/../libexec/gcc/arm-rtems4.11/4.9.1/collect2 \
  -dc -dp -N -o /home/pi/repo/rtems/build/arm-lpc17xx_ea_ram/omk-template/_compiled/lpc17xx_ea_ram/bin/appnet \
  /opt/rtems4.11/arm-rtems4.11/lpc17xx_ea_ram/lib/start.o \
  /usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc/arm-rtems4.11/4.9.1/thumb/armv7-m/crti.o \
  /usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc/arm-rtems4.11/4.9.1/thumb/armv7-m/crtbegin.o \
  -e _start \
  -L/home/pi/repo/rtems/build/arm-lpc17xx_ea_ram/omk-template/_compiled/lpc17xx_ea_ram/lib \
  -L/usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc/arm-rtems4.11/4.9.1/thumb/armv7-m \
  -L/usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc/arm-rtems4.11/4.9.1/../../../../arm-rtems4.11/lib/thumb/armv7-m \
  -L/opt/rtems4.11/arm-rtems4.11/lpc17xx_ea_ram/lib -L/usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc/arm-rtems4.11/4.9.1 \
  -L/usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc \
  -L/usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc/arm-rtems4.11/4.9.1/../../../../arm-rtems4.11/lib \
   init.o task_1.o -lbar -lnfs \
   /usr/arm-rtems4.11/lib/thumb/armv7-m/libm.a \
   --start-group -lgcc --start-group -lrtemsbsp -lrtemscpu -lc -lgcc --end-group \
   -T /opt/rtems4.11/arm-rtems4.11/lpc17xx_ea_ram/lib/linkcmds --end-group \
   /usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc/arm-rtems4.11/4.9.1/thumb/armv7-m/crtend.o \
   /usr/arm-rtems4.11/gcc/4.9.1/bin/../lib/gcc/arm-rtems4.11/4.9.1/thumb/armv7-m/crtn.o 

What seems to be problem cause is the fact, that bsp_specs adds libraries
group including librtemscpu.a after libm.a. Because libm.a is not in the group
then repeated search for sqrt() is not run after ping inclussion.
Adding libm at the end of manually crafted collect2 line helps

   /usr/arm-rtems4.11/lib/thumb/armv7-m/libm.a

Sequence of link specification

%{qrtems: --start-group  -lrtemsbsp -lrtemscpu  -lc -lgcc --end-group %{!qn

is compiled in GCC driver /usr/arm-rtems4.11/gcc/4.9.1/bin/gcc, which is
defined in GCC sources

gcc-4.9.1/gcc/config/rtems.h

#undef LIB_SPEC
#define LIB_SPEC "%{!qrtems: " STD_LIB_SPEC "} " \
"%{!nostdlib: %{qrtems: --start-group \
 -lrtemsbsp -lrtemscpu \
 -lc -lgcc --end-group %{!qnolinkcmds: -T linkcmds%s}}}"

If float funtions support is needed by rtems core libraries then
"-lm" or "libm.a" has to be included in this define.

The problem is caused by "ping" statistic/standard deviation computation
in there

cpukit/libmisc/shell/main_ping.c:1642

	if (nreceived && timing) {
		double n = nreceived + nrepeats;
		double avg = tsum / n;
		double vari = tsumsq / n - avg * avg;
		(void)printf(
		    "round-trip min/avg/max/stddev = %.3f/%.3f/%.3f/%.3f ms\n",
		    tmin, avg, tmax, sqrt(vari));
	}

I expect that problem can be hidden on hardware floating point
targets because sqrt is inlined/translated directly to FPU
instructions.

If the politics is not to require/pull in FPU support for core
libraries then I suggest to replace whole statistic computation
by fixed point/fraction based code or at least use integer/long based
sqrt replacement.

May it be that problem is specific to my local toolchain build
and makefiles used but my guess is that it is generic.

Best wishes
                Pavel


More information about the devel mailing list