fliX
fliX

Reputation: 813

No undefined references when compiling shared library

Im wondering why Im getting no undefined references when compiling as a shared library using -shared as an option for gcc. Consider the following case:

#include <confuse.h>

int
main(int argc, char **argv)
{
    cfg_opt_t opts[1];
    cfg_t *cfg = cfg_init(opts, CFGF_NOCASE);
    return 0;
}

libconfuse is needed here in order to run the program properly. If im compiling it as a "normal" application without specifying that libconfuse is needed (-lconfuse) im getting the following (from my perspective regular) error:

$ gcc -Wall -Wno-unused-variable test.c -o test
/tmp/ccTVz6an.o: In function `main':
test.c:(.text+0x20): undefined reference to `cfg_init'
collect2: error: ld returned 1 exit status

If im compiling the same code as a shared library im not getting any error message regarding the library:

$ gcc -Wall -Wno-unused-variable test.c -o test.so -shared
$ echo $?
0

Can someone please bring light into darkness?

Upvotes: 1

Views: 1633

Answers (2)

rodrigo
rodrigo

Reputation: 98358

You are compiling a (shared) library, not a program, and libraries are expected not to be complete, so undefined references do not prevent the shared library from building.

Yes, it may sound a bit surprising, particularly if you come from a OS (Windows?) where the shared libraries are always fully linked, but that's how ELF works.

If you want to ensure that all your references are are resolved when building a shared library you can use the linker option --no-undefined:

gcc -Wall -Wno-unused-variable test.c -o test.so -shared -Wl,--no-undefined

Note that libraries used to resolve references when linking a shared library will be added to the header of that library, as NEEDED entries, and then linked automatically when using that library. See objdump -p for details.

Upvotes: 4

With shared libraries (not static ones), you could link a library libA.so into your other library libB.so.

So you could compile your shared library as:

  gcc -Wall -Wno-unused-variable -fPIC test.c \
       -o libmytest.so -shared -lconfuse

Later you would link that library to some main.c with

  gcc -Wall main.c -lmytest -L. -o myprog

or you could load it at runtime, using dlopen(3) on ./libmytest.so (read the man page about why ./ is significant to dlopen)

Simple explanations are in the Program Library HowTo. But Drepper's paper: How to Write Shared Libraries is the best reference.

And it is permitted for a shared library (or even a static one) to have undefined references, since quite often the user of that library would explicitly link the lower level libraries needed by it.

Upvotes: 2

Related Questions