cgcc

C program linking with shared library without setting LD_LIBRARY_PATH


I was reading Introduction to GCC and it says if a package has both .a and .so. gcc prefer the shared library. By default the loader searches for shared libraries only in a predefined set of system directories, such as /usr/local/lib and /usr/lib. If the library is not located in one of these directories it must be added to the load path, or you need to use -static option to force it to use the .a library. However, I tried the following:

vim hello.c:

#include <gmp.h>
#include <stdio.h>

int main() {
        mpz_t x;
        mpz_init(x);
        return 0;
}

gcc hello.c -I/opt/include -L/opt/lib -lgmp  (my gmp library is in opt)
./a.out

And it runs. The book says it should have the following error:

./a.out: error while loading shared libraries:
libgdbm.so.3: cannot open shared object file:
No such file or directory

(well, the book uses GDBM as example but I used GMP, but this won't matter right?)

However, I did not set LD_LIBRARY_PATH=/opt/lib, and as you can see I did not use -static option either, but a.out still runs.

Can you all tell me why and show me how to get the error described in the book? Yes I want the error so I will understand what I misunderstood.


Solution

  • From your response to my comment:

    linux-gate.so.1 => (0xb7746000)
    libgmp.so.10 => /usr/lib/i386-linux-gnu/libgmp.so.10 (0xb76c5000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7520000)
    /lib/ld-linux.so.2 (0xb7747000) 
    

    So, your program is picking up the lib from /usr/lib.

    What you can try to do is rename the lib in your /opt/lib, and link against the new name.

    mv /opt/lib/libgmp.so /opt/lib/libgmp-test.so
    gcc hello.c -I/opt/include -L/opt/lib -lgmp-test
    

    Then try running the program. Also, compare the result of ldd against the new a.out against what you got before.