Difference between revisions of "Dynamic linking"

From Linuxintro
imported>ThorstenStaerk
imported>ThorstenStaerk
m (little migration fail ;))
 
(3 intermediate revisions by the same user not shown)
Line 18: Line 18:
 
  extern "C" void help()  
 
  extern "C" void help()  
 
  {
 
  {
   std::cout << "hello world" << '\
+
   std::cout << "hello world" << '\';
';
 
 
  }
 
  }
 
  EOF
 
  EOF
Line 42: Line 41:
 
  tweedleburg:~/test # ./a.out
 
  tweedleburg:~/test # ./a.out
 
  hello world
 
  hello world
 +
But the string hello world is not contained in the executable file:
 +
tweedleburg:~/test # strings a.out | grep hello
 +
tweedleburg:~/test #
 +
And if we disassemble the executable file, we see a call to the function help:
 +
tweedleburg:~/test # [[objdump]] -d a.out | [[grep]] help
 +
00000000004006b8 <help@plt>:
 +
  4007b8:      e8 fb fe ff ff          callq  4006b8 <help@plt>
  
 
= See also =
 
= See also =
 
* [[linking]]
 
* [[linking]]
 +
* [[static linking]]
 
* [[libraries]]
 
* [[libraries]]
 
* [[dependencies]]
 
* [[dependencies]]

Latest revision as of 21:13, 14 December 2014

This is an example how you get your own dynamic linked library and a program that uses it. The only thing you will need to is to install gcc:

cat > main.cpp << EOF
#include <iostream>
#include <dlfcn.h> 

extern "C" void help(); 

int main() 
{
  help();
  return 0;
}
EOF

We have now created your main program. It contains a declaration of the function help(), but no implementation. The program does nothing more than to call the function help(), notably, without knowing about its implementation.

cat > help.cpp << EOF
#include <iostream>

extern "C" void help() 
{
  std::cout << "hello world" << '\';
}
EOF

We have now created your library. It implements the function help().

gcc help.cpp -o libhelp.so -ldl -shared -fPIC

We have now built your library, help.so. As search path for libraries (-L) also the current path (.) shall be used:

g++ main.cpp -lhelp -L.

Now we have built an executable a.out that uses a library libhelp.so. This looks for me like this:

tweedleburg:~/test # ldd a.out
        linux-vdso.so.1 =>  (0x00007fff6dffe000)
        libhelp.so => not found
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fec65a02000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fec657ac000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fec65595000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fec6523c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fec65d0e000)

Of course we cannot get it running:

tweedleburg:~/test # ./a.out
./a.out: error while loading shared libraries: libhelp.so: cannot open shared object file: No such file or directory

Without the correct path to search the libraries:

tweedleburg:~/test # export LD_LIBRARY_PATH=.
tweedleburg:~/test # ./a.out
hello world

But the string hello world is not contained in the executable file:

tweedleburg:~/test # strings a.out | grep hello
tweedleburg:~/test # 

And if we disassemble the executable file, we see a call to the function help:

tweedleburg:~/test # objdump -d a.out | grep help
00000000004006b8 <help@plt>:
  4007b8:       e8 fb fe ff ff          callq  4006b8 <help@plt>

See also