Pages

Tuesday, March 10, 2015

Dynamic loading and un loading of shared libraries in C in Linux

This is the other way of using Dynamic libraries by loading/unloading at runtime.

Please refer to my earlier posts for more explanation/understanding

  • Click here to understand stages of compilation in Linux using GCC
  • Click here to understand Static & Dynamic libraries in C
  • Click here to understand creation of static library 
  • Click here to understand creation of Dynamic library
Step1: Implement the library source. Let us assume there are two files namely one.c and two.c each implementing one function as follows
$ vim one.c

#include<stdio.h>
int myadd(int a, int b){
        return a+b;
}

$ vim two.c

#include<stdio.h>
int mymult(int a, int b){
       return a*b;
}

Step2: Compile the sources to generate relocatable.

Note: ‘.so’ is the extension for dynamic libraries.

$ gcc -c -fpic one.c 
        ( to create a relocatable one.o )
$ gcc -c -fpic two.c 
       ( to create a relocatable two.o ) 
$ gcc -shared -o libmyown.so one.o two.o
        ( libmyown.so is the name of the dynamic library to be created )
         - shared flag used to create a shared library 

Step3: Create the source file to dynamically load our share-library.

here funAddPtr and funMultPtr are the function pointer for myadd and mymult

Please refer to man-pages for dlopen, dlsym, dlclose 

$ vim test.c


#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main()
{
void *module;
int (*funAddPtr)(int,int);
int (*funMultPtr)(int,int);

char *error;

printf("Example : Dynamic loading/un-loading of shared library
");



/* Load dynamically loaded library */
module = dlopen("./libmyown.so", RTLD_LAZY);
if (!module) {
fprintf(stderr, "Couldnt open libmine.so: %s
", 
dlerror());
exit(1);
}

    funAddPtr = dlsym(module, "myadd");
    if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s
", error);

        exit(1);
    }

printf("Sum of 3,4 = %d
", funAddPtr(3,4));



funMultPtr = dlsym(module, "mymult");
if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s
", error);

        exit(1);
    }
    
    printf("Product of 3,4 = %d
", funMultPtr(3,4));


dlclose(module);

return 0;
}

Step4: Compile the source and run

$ gcc -rdynamic -o test test.c -ldl

$./test

Example : Dynamic loading/un-loading of shared library
Sum of 3,4 = 7
Product of 3,4 = 12





No comments:

Post a Comment

Note: Only a member of this blog may post a comment.