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?