Difference between revisions of "Esempio libreria eseguibile"

From vsd
Jump to navigation Jump to search
m
m
 
Line 33: Line 33:
 
but it can be loaded as a shared library.  
 
but it can be loaded as a shared library.  
  
Thi
+
This is the file dltest.c:
s is the file dltest.c:
 
 
<source lang=C>
 
<source lang=C>
 
#include <stdio.h>
 
#include <stdio.h>
Line 77: Line 76:
 
</source>
 
</source>
  
Let us launch dltest:
+
Let us compile dltest...
 +
<pre>
 +
gcc -o dltest dltest.c -ldl
 +
</pre>
 +
and launch it:
 
<pre>
 
<pre>
 
$ ./dltest 44
 
$ ./dltest 44
Line 93: Line 96:
 
* http://marklodato.github.io/2009/10/03/executable-shared-libraries.html
 
* http://marklodato.github.io/2009/10/03/executable-shared-libraries.html
 
* https://unix.stackexchange.com/questions/223385/why-and-how-are-some-shared-libraries-runnable-as-though-they-are-executables
 
* https://unix.stackexchange.com/questions/223385/why-and-how-are-some-shared-libraries-runnable-as-though-they-are-executables
 +
an alternative command to compile library.c is
 +
  gcc -fPIC -pie -o library library.c -Wl,-E

Latest revision as of 13:40, 16 April 2019

File library.c:

// library.c
#include <stdio.h>
#include <stdlib.h>

void foo(int x) {
    printf("foo(%d)\n", x);
}

int main(int argc, char **argv) {
    if (argc != 2) {
        fprintf(stderr, "USAGE: %s n\n", argv[0]);
        exit(1);
    }
    foo(atoi(argv[1]));
    return 0;
}

gcc command:

gcc -fPIC -fPIE -pie -rdynamic -o library library.c

library is an executable:

$ ./library 44
foo(44)

but it can be loaded as a shared library.

This is the file dltest.c:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

void (*pfoo)(int x);
int (*pmain)(int argc, char **argv);

int main(int argc, char *argv[])
{
        void *handle;
        double (*cosine)(double);
        char *error;

        handle = dlopen("./library", RTLD_LAZY);
        if (!handle) {
                fprintf(stderr, "%s\n", dlerror());
                exit(EXIT_FAILURE);
        }

        dlerror();    /* Clear any existing error */
        printf("dlopen done\n");
        pfoo = (typeof(pfoo)) dlsym(handle, "foo");
        printf("pfoo %p\n",pfoo);
        pmain = (typeof(pmain)) dlsym(handle, "main");
        printf("pmain %p\n",pmain);

        pfoo(42);

        pmain(argc, argv);

        error = dlerror();
        if (error != NULL) {
                fprintf(stderr, "%s\n", error);
                exit(EXIT_FAILURE);
        }

        dlclose(handle);
        exit(EXIT_SUCCESS);
}

Let us compile dltest...

gcc -o dltest dltest.c -ldl

and launch it:

$ ./dltest 44
dlopen done
pfoo 0x7f04c6da7165
pmain 0x7f04c6da7189
foo(42)
foo(44)

It works!


Credits:

an alternative command to compile library.c is

 gcc -fPIC -pie -o library library.c -Wl,-E