home | tech | osdev | misc | code | bookmarks (broken) | contact | README

# ld notes

## Troubleshooting

### "ld terminated with signal 9 [killed]" problem

When linking, you may encounter this problem. It means that the available memory you have for linking is not enough. Like said in this message, try to add more RAM or swap memory.

### -L and -l arguments are OK, but it still give "undefined reference"

#### First case

You try to compile against a 3rd-party library, you pass -L and -l correctly but the linker still complains about "undefined reference"? It is probably because the external library was compiled with a C compiler and you are using a C++ compiler in your application.

To solve this problem, tell the linker that the library was compiled with a C compiler, surrounding its includes with the 'extern "C"' directive.

Here is how it looks, when trying to add Lua to a C++ application:

extern "C" {
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
}
#include <stdio.h>
#include <string.h>


This message in the lua-users list and this article helped me with it.

#include <lua.hpp>


That automatically includes the extern "C" thing.

#### Second case

Have you checked whether or not the library file really has the symbols.

When compiling the Siesta application, with support for MPI, I got thousands of lines with the following error:

.../siesta-3.0-rc1/Src/bands.F:362: undefined reference to __mpi__integer_s_MOD_mpi_bcast_t'


So I decided to check whether or not the library that should have the symbols, really had it:

$objdump -t Obj/MPI/libmpi_f90.a | grep bcast 0000000000003400 l .text 0000000000000000 mpi__integer_v_mp_mpi_bcast_t_??unw 0000000000000280 l .IA_64.unwind_info 0000000000000018 __udt_mpi__integer_v_mp_mpi_bcast_t_??unw 0000000000008cc0 l .text 0000000000000000 mpi__r4_v_mp_mpi_bcast_t_??unw 00000000000006a0 l .IA_64.unwind_info 0000000000000018 __udt_mpi__r4_v_mp_mpi_bcast_t_??unw 000000000000e580 l .text 0000000000000000 mpi__c4_v_mp_mpi_bcast_t_??unw 0000000000000ac0 l .IA_64.unwind_info 0000000000000018 __udt_mpi__c4_v_mp_mpi_bcast_t_??unw 0000000000013e40 l .text 0000000000000000 mpi__r8_v_mp_mpi_bcast_t_??unw 0000000000000ee0 l .IA_64.unwind_info 0000000000000018 __udt_mpi__r8_v_mp_mpi_bcast_t_??unw 0000000000019700 l .text 0000000000000000 mpi__c8_v_mp_mpi_bcast_t_??unw 0000000000001300 l .IA_64.unwind_info 0000000000000018 __udt_mpi__c8_v_mp_mpi_bcast_t_??unw 000000000001efc0 l .text 0000000000000000 mpi__logical_v_mp_mpi_bcast_t_??unw 0000000000001720 l .IA_64.unwind_info 0000000000000018 __udt_mpi__logical_v_mp_mpi_bcast_t_??unw 00000000000252c0 l .text 0000000000000000 mpi__character_v_mp_mpi_bcast_t_??unw 0000000000001b40 l .IA_64.unwind_info 0000000000000018 __udt_mpi__character_v_mp_mpi_bcast_t_??unw 000000000002b500 l .text 0000000000000000 mpi__integer_s_mp_mpi_bcast_t_??unw 0000000000001f60 l .IA_64.unwind_info 0000000000000018 __udt_mpi__integer_s_mp_mpi_bcast_t_??unw 0000000000030dc0 l .text 0000000000000000 mpi__r4_s_mp_mpi_bcast_t_??unw 0000000000002380 l .IA_64.unwind_info 0000000000000018 __udt_mpi__r4_s_mp_mpi_bcast_t_??unw 0000000000036680 l .text 0000000000000000 mpi__c4_s_mp_mpi_bcast_t_??unw 00000000000027a0 l .IA_64.unwind_info 0000000000000018 __udt_mpi__c4_s_mp_mpi_bcast_t_??unw 000000000003bf40 l .text 0000000000000000 mpi__r8_s_mp_mpi_bcast_t_??unw 0000000000002bc0 l .IA_64.unwind_info 0000000000000018 __udt_mpi__r8_s_mp_mpi_bcast_t_??unw 0000000000041800 l .text 0000000000000000 mpi__c8_s_mp_mpi_bcast_t_??unw 0000000000002fe0 l .IA_64.unwind_info 0000000000000018 __udt_mpi__c8_s_mp_mpi_bcast_t_??unw 00000000000470c0 l .text 0000000000000000 mpi__logical_s_mp_mpi_bcast_t_??unw 0000000000003400 l .IA_64.unwind_info 0000000000000018 __udt_mpi__logical_s_mp_mpi_bcast_t_??unw 000000000004d3c0 l .text 0000000000000000 mpi__character_s_mp_mpi_bcast_t_??unw 0000000000003820 l .IA_64.unwind_info 0000000000000018 __udt_mpi__character_s_mp_mpi_bcast_t_??unw 0000000000003400 g F .text 0000000000000240 mpi__integer_v_mp_mpi_bcast_t_ 0000000000000000 *UND* 0000000000000000 mpi_bcast_ 0000000000008cc0 g F .text 0000000000000240 mpi__r4_v_mp_mpi_bcast_t_ 000000000000e580 g F .text 0000000000000240 mpi__c4_v_mp_mpi_bcast_t_ 0000000000013e40 g F .text 0000000000000240 mpi__r8_v_mp_mpi_bcast_t_ 0000000000019700 g F .text 0000000000000240 mpi__c8_v_mp_mpi_bcast_t_ 000000000001efc0 g F .text 0000000000000240 mpi__logical_v_mp_mpi_bcast_t_ 00000000000252c0 g F .text 00000000000002c0 mpi__character_v_mp_mpi_bcast_t_ 000000000002b500 g F .text 0000000000000240 mpi__integer_s_mp_mpi_bcast_t_ 0000000000030dc0 g F .text 0000000000000240 mpi__r4_s_mp_mpi_bcast_t_ 0000000000036680 g F .text 0000000000000240 mpi__c4_s_mp_mpi_bcast_t_ 000000000003bf40 g F .text 0000000000000240 mpi__r8_s_mp_mpi_bcast_t_ 0000000000041800 g F .text 0000000000000240 mpi__c8_s_mp_mpi_bcast_t_ 00000000000470c0 g F .text 0000000000000240 mpi__logical_s_mp_mpi_bcast_t_ 000000000004d3c0 g F .text 00000000000002c0 mpi__character_s_mp_mpi_bcast_t_  Those are not the exactly symbols I was looking for, there is something strange... You see the .IA_64.unwind_info information just before some symbols' names? This library was compiled for the Itanium (ia64) architecture, not X86_64 (amd64) I'm working on. I found another file libmpi_f90.a under the same application source directory, used objdump to check for the symbols: $ objdump -t Src/MPI/libmpi_f90.a  | grep bcast
0000000000000d80 g     F .text  0000000000000007 __mpi__character_s_MOD_mpi_bcast_t
0000000000000000         *UND*  0000000000000000 mpi_bcast_
0000000000000f90 g     F .text  0000000000000007 __mpi__logical_s_MOD_mpi_bcast_t
00000000000011a0 g     F .text  0000000000000007 __mpi__c8_s_MOD_mpi_bcast_t
00000000000013b0 g     F .text  0000000000000007 __mpi__r8_s_MOD_mpi_bcast_t
00000000000015c0 g     F .text  0000000000000007 __mpi__c4_s_MOD_mpi_bcast_t
00000000000017d0 g     F .text  0000000000000007 __mpi__r4_s_MOD_mpi_bcast_t
00000000000019e0 g     F .text  0000000000000007 __mpi__integer_s_MOD_mpi_bcast_t
0000000000001bf0 g     F .text  0000000000000007 __mpi__character_v_MOD_mpi_bcast_t
0000000000001e00 g     F .text  0000000000000007 __mpi__logical_v_MOD_mpi_bcast_t
0000000000002010 g     F .text  0000000000000007 __mpi__c8_v_MOD_mpi_bcast_t
0000000000002220 g     F .text  0000000000000007 __mpi__r8_v_MOD_mpi_bcast_t
0000000000002430 g     F .text  0000000000000007 __mpi__c4_v_MOD_mpi_bcast_t
0000000000002640 g     F .text  0000000000000007 __mpi__r4_v_MOD_mpi_bcast_t
0000000000002850 g     F .text  0000000000000007 __mpi__integer_v_MOD_mpi_bcast_
`

A much cleaner output and the symbols we are looking for. So let's link against the later library, not the former.

(Why there would be two files, with the same name but targeting different architectures I don't know. It was probably a mistake from the colleague that made the tarball for me).

### glibc detected ... invalid pointer: ...

It is not exactly a linking problem, but a shared library loading problem. For now, it is in this file. (TODO: change that to a better place?)

So, if you get an error like that, gdb says nothing, backtrace is cryptographic, check your LD_LIBRARY_PATH environment and see if the shared libraries you are using are the correct versions that you should really use.

I got this error when I had two versions of Qt, 4.3.4 and 4.5.1, and two compiled Qwt versions, one compiled for each Qt version. So, I had:

• Qt 4.3.4: against this I compiled and used Qwt 5.1.1
• Qt 4.5.1: against this I compiled and used Qwt 5.2.0

So, my problem was that I was compiling my application against Qt 4.3.4 and Qwt 5.1.1, but my LD_LIBRARY_PATH environment variable points to the Qwt 5.2.0 libraries directory.