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

typedef void (*test_func_t)(int *px);
int  x;

int main(void)
{
    void*  lib = dlopen("libtest1.so", RTLD_NOW);
    test_func_t test_func;

    if (lib == NULL) {
        fprintf(stderr, "Can't load library: %s\n", dlerror());
        return 1;
    }

    printf("Loaded !\n");

    test_func = dlsym(lib, "test1_set");
    if (test_func == NULL) {
        fprintf(stderr, "Can't find test function\n");
        return 2;
    }

    x = 0;
    test_func(&x);

    if (x == 1) {
        printf("Test function called !\n");
    } else {
        fprintf(stderr, "Test function failed to set variable !\n");
        return 3;
    }

    dlclose(lib);
    printf("Unloaded !\n");

    if (x == 2) {
        printf("Test destructor called !\n");
    } else if (x == 1) {
        fprintf(stderr, "Test destructor was *not* called !\n");
        return 4;
    } else {
        fprintf(stderr, "Test destructor called but returned invalid value (%d)\n", x);
        return 5;
    }
    return 0;
}