Welcome to the new Parasoft forums! We hope you will enjoy the site and try out some of the new features, like sharing an idea you may have for one of our products or following a category.

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 toInsure::NativeThread::newThread(Insure::Lock&)'
.../Insure++/lib/libinsure.so: undefined reference to Insure::Mutex::newMutex(Insure::ThisThread*, Insure::LibraryCall&)' .../Insure++/lib/libinsure.so: undefined reference toInsure::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:

Comments