Reputation: 360
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
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
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
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
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