Here are some notes on building an using libraries in their different flavours on POSIX systems.
the library
hello.h
typedef void (*HelloFunc)();void hello();
hello.c
#include <stdio.h>#include "hello.h"
void hello()
{
printf("hello world\n");
}
building the library:
gcc -fPIC -c hello.cgcc -shared -o libhello.o hello.o
binding on load time
main.c
#include "hello.h"int main()
{
hello();
return 0;
}
building main
gcc -o main main.c -L. -lhello
running main
$ LD_LIBRARY_PATH=. ./main hello world
binding on run time
main2.c
#include <dlfcn.h>
#include <stdio.h>
#include "hello.h"
int main()
{
void* handle = dlopen("./libhello.so", RTLD_NOW);
if (handle == NULL) {
printf("dlopen failed: %s\n", dlerror());
return 1;
}
void* symbol = dlsym(handle, "hello");
if (symbol == NULL) {
printf("dlsym failed: %s\n", dlerror());
return 1;
}
HelloFunc helloFunc = (HelloFunc) symbol;
helloFunc();
if (dlclose(handle) != 0) {
printf("dlclose failed: %s\n", dlerror());
return 1;
}
return 0;
}
building main
gcc -o main2 main2.c -ldl
running main
$ ./main2 hello world
static binding
building the library
gcc -c hello.c ar rc libhello.a hello.o ranlib libhello.a
building main
gcc -o main main.o libhello.a
running main
$ ./main hello world
further reading
tools:- ldd - print shared library dependencies
- nm - list symbols from object files
- objdump - display information from object files
- readelf - Displays information about ELF files
Update: Ian Lance Taylor has written a series of 20 articles on linkers and the ELF format. Here is the first one.
No comments:
Post a Comment