Skip to content

Instantly share code, notes, and snippets.

@DeadNumbers
Forked from tailriver/ dlopen_sample.c
Created August 20, 2023 05:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DeadNumbers/0762092a8073969a6aa5c3d4028d0b97 to your computer and use it in GitHub Desktop.
Save DeadNumbers/0762092a8073969a6aa5c3d4028d0b97 to your computer and use it in GitHub Desktop.
A sample of using dlopen library.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
int main(int argc, char** argv)
{
void *handle;
void (*func_print_name)(const char*);
if (argc != 2) {
fprintf(stderr, "Usage: %s animal_type\n", argv[0]);
return EXIT_FAILURE;
}
if (strcmp(argv[1], "dog") == 0) {
handle = dlopen("./libdog.so", RTLD_LAZY);
} else if (strcmp(argv[1], "cat") == 0) {
handle = dlopen("./libcat.so", RTLD_LAZY);
} else {
fprintf(stderr, "Error: unknown animal type: %s\n", argv[1]);
return EXIT_FAILURE;
}
if (!handle) {
/* fail to load the library */
fprintf(stderr, "Error: %s\n", dlerror());
return EXIT_FAILURE;
}
*(void**)(&func_print_name) = dlsym(handle, "print_name");
if (!func_print_name) {
/* no such symbol */
fprintf(stderr, "Error: %s\n", dlerror());
dlclose(handle);
return EXIT_FAILURE;
}
func_print_name(argv[1]);
dlclose(handle);
return EXIT_SUCCESS;
}
#pragma once
void print_name(const char* type);
#include "animal.h"
#include <stdio.h>
void print_name(const char* type)
{
printf("Tama is a %s.\n", type);
}
#include "animal.h"
#include <stdio.h>
void print_name(const char* type)
{
printf("Pochi is a %s.\n", type);
}
app = dlopen_sample
lib = libcat.so libdog.so
CFLAGS = -Wall -ansi -pedantic
LDFLAGS = -ldl
all: $(app) $(lib)
lib%.so: %.c
$(CC) -shared -fPIC $(CFLAGS) -o $@ $<
clean:
$(RM) $(app) $(lib)
run: all
./$(app) cat
./$(app) dog
-./$(app) bear
$(lib): animal.h
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment