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.
Comments
-
This issue is fixed in Insure++ v7.5.3. [INS-7082]
0