1

I have just upgraded from ubuntu 13.04 to 13.10 (32 bit)

This has upgraded gcc and ld

the version no.s are now:

gcc 4.8.1
ld 2.23.52.20130913

the versions I was using previously with 13.04 were:

gcc 4.7.3
ld 2.23.2

Prior to the update, I was able to build both a debug and release version of a C project. However with the new gcc and ld I am getting strange behaviour, when building the same C project in as much as including the gcc -O2 optimisation setting causes a subsequent link error with complaints about not being able to find the math lib functions, fmin, fmax, ceil, pow etc.

the output from the makefile looks like this:

ben@esroe-5:~/projects/oskar/tomek/core_harness/src$ make
gcc -g -Wall -DDEBUG=1 -I/home/ben/projects/oskar/tomek/core/src -I/home/ben/projects/oskar/tomek/pulse_IO/src -I/home/ben/projects/oskar/g2/src  oskar_harness.c -c -o ../build/linux/debug/oskar_harness.o
gcc -g -Wall -DDEBUG=1 -I/home/ben/projects/oskar/tomek/core/src -I/home/ben/projects/oskar/tomek/pulse_IO/src -I/home/ben/projects/oskar/g2/src  ../build/linux/debug/oskar_harness.o -L/home/ben/projects/oskar/tomek/core/src -L/home/ben/projects/oskar/tomek/core/build/linux/debug -L/home/ben/projects/oskar/tomek/core/build/linux/release -lOskar_dbg -lm -lrt -o ../build/linux/debug/OskarHarness_dbg
gcc -pg -O2 -Wall -DDEBUG=0 -I/home/ben/projects/oskar/tomek/core/src -I/home/ben/projects/oskar/tomek/pulse_IO/src -I/home/ben/projects/oskar/g2/src  oskar_harness.c -c -o ../build/linux/release/oskar_harness.o
gcc -pg -O2 -Wall -DDEBUG=0 -I/home/ben/projects/oskar/tomek/core/src -I/home/ben/projects/oskar/tomek/pulse_IO/src -I/home/ben/projects/oskar/g2/src  ../build/linux/release/oskar_harness.o -L/home/ben/projects/oskar/tomek/core/src -L/home/ben/projects/oskar/tomek/core/build/linux/debug -L/home/ben/projects/oskar/tomek/core/build/linux/release -lOskar_rel -lm -lrt -o ../build/linux/release/OskarHarness_rel
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `ceil'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `fmod'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `fmin'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `exp'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `fmax'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `log'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `pow'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `sqrt'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `floor'
collect2: error: ld returned 1 exit status
make: *** [OskarHarness_rel] Error 1

The project has just one .c file that is linked with a shared library (it is effectively a 'harness' to allow the API provided by the shared library to be used) - you can see that the debug version is managing to link ok whereas the release version is causing the linker to spit out errors regarding the math lib

I have pinpointed the error to the use of the -O2 flag, if this is removed from the gcc call to compile the release version of the .o file then the link errors go away

I am unsure as to what is going on here, I have had a look at the nm output of the -O2 and non -O2 .o files but it didn't make it any clearer

Is there any reason why setting the -O2 optimisation flag should in any way affect the ability of the linker to find the math lib functions as shown in the makefile output snippet listed above?

bph
  • 10,728
  • 15
  • 60
  • 135

0 Answers0