Michael Schilling
Michael Schilling

Reputation: 360

Proper use libdl and dynamically linked libraries

I need to dynamically link a library that I have created. I'm not exactly sure what the issue is. It all compiles properly, but I always catch handle as the NULL pointer:

void *handle;
char *error;
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY);
//same error comes up with full path as well as './hw11...'
if(!handle){
    error = dlerror();
    printf("%s\n", error);
    printf("Error loading library.\n");
    exit(1);
}

I cant get passed this error and I'm not sure what could possibly be wrong. I'm pretty sure I've compiled everything correctly. Here are the compilation steps I used:

gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4

I'm getting an error that reads

only ET_DYN and ET_EXEC can be loaded.

Upvotes: 17

Views: 19056

Answers (4)

colmustard
colmustard

Reputation: 11

gcc -fPIC -shared -rdynamic  library.c -o library.o

works for me on Linux when compiling the library for the code that opens it, you need -ldl

Upvotes: 1

NPE
NPE

Reputation: 500337

When building hw11-lib-michaelSchilling.so, you don't appear to be telling gcc that you want a shared object (the .so in the name isn't enough).

With the -c it's producing an object file (not a shared object) and calling it michaelSchilling.so. The linker doesn't even get invoked.

Remove the -c from the gcc command line and add -shared:

gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so

Upvotes: 31

R.. GitHub STOP HELPING ICE
R.. GitHub STOP HELPING ICE

Reputation: 215259

A slash (/) as the first character of a pathname indicates that the pathname is absolute (relative to the root directory), not relative to the current working directory and certainly not relative to the location of the binary. You'll need to specify the full path by figuring out the location of the binary (which is not an easy problem in itself) or you might be able to use $ORIGIN with dlopen (it works with rpath but I'm uncertain whether it works with dlopen).

Upvotes: 1

mah
mah

Reputation: 39807

Is hw11-lib-michaelSchilling.so in the absolute root of your file system? You're claiming it is by leading a slash on it... but I suspect it's not.

In your error handling, include the output of dlerror() in what you print, to find the cause of failure.

Upvotes: 0

Related Questions