Undefined reference errors occurr when linking in Insure++ symbols in Ubuntu

In Ubuntu, linking errors with Insure++ (undefined references of Insure++ symbols, see examples below) are caused by a change in the default behavior of the linker from previous versions of Ubuntu.

Error example: ".../Insure++/lib/libinsure.so: undefined reference to `Insure::Thread::startFunction()'"

Explanation:

This behavior occurs because Ubuntu linker, by default, attempts to optimize the symbols linked in. This means the linker will throw away symbols it deems unnecessary, such as the Insure++ libraries. However, these Insure++ libraries are required, as is proved by the linking error. The solution is to add the linker option "-Wl,--no-as-needed" to prevent the linker from automatically optimizing the link line.

Example
In this example, let's assume the following.

OS : Ubuntu v12.04

Compiler : GCC v4.6.3

Insure++ v7.4.3

We would like to Instrument the following .c file with Insure++.

message_rec.c

To compile the file with Insure++, perform the following command:

$ insure gcc -g message_rec.c

Once the compilation is completed, perform the following link command with Insure++:

$ insure gcc -g -o message_rec message_rec.o

IF a similar output results from the above link command:
.../Insure++/lib/libinsure.so: undefined reference to Insure::Thread::startFunction()' .../Insure++/lib/libinsure.so: undefined reference to Insure::NativeThread::newThread(Insure::Lock&)'
.../Insure++/lib/libinsure.so: undefined reference to Insure::Mutex::newMutex(Insure::ThisThread*, Insure::LibraryCall&)' .../Insure++/lib/libinsure.so: undefined reference to Insure::Thread::thisThread()'
.../Insure++/lib/libinsure.so: undefined reference to `Insure::Thread::fiberStartFunction()'
collect2: ld returned 1 exit status

THEN the option "-Wl,--no-as-needed" needs to be added to the link command:

$ insure gcc -g -o message_rec message_rec.o -Wl,--no-as-needed

This will tell the linker to use all the symbols and do not throw any of the symbols away. The link should no longer produce the same error.

Tagged:
Sign In or Register to comment.