I am in the process of trying to port rp-l2tp to openbsd.

I have a problem with dlopen(). rp-l2tp calls dlopen() to load its
sync-pppd.so module, and this in turn has callbacks to functions defined in
the main program. However under OpenBSD these callbacks fail to link.

Here's a simple test to demonstrate.

==> Makefile <==
all: test1 test2

test1: test1.c test.h
        gcc -Wall -rdynamic -o test1 test1.c -ldl

test2: test2.c test.h
        gcc -Wall -shared -o test2.so test2.c

==> test1.c <==
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "test.h"

int bar(const char *msg)
{
    fprintf(stderr, "Message: %s\n", msg);
    return 0;
}

int main(int argc, char **argv) {
    void *handle;
    int (*my_foo)(void);
    char *error;

    handle = dlopen ("./test2.so", RTLD_NOW);
    if (!handle) {
        fprintf (stderr, "%s\n", dlerror());
        exit(1);
    }

    dlerror();    /* Clear any existing error */
    *(void **) (&my_foo) = dlsym(handle, "foo");
    if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s\n", error);
        exit(1);
    }

    (*my_foo)();
    dlclose(handle);
    return 0;
}

==> test2.c <==
#include "test.h"

int foo(void)
{
    bar("hello, world!");
    return 0;
}

==> test.h <==
int foo(void);
int bar(const char *);

If I run this under Linux (Ubuntu-6.06) it works:

$ make
gcc -Wall -rdynamic -o test1 test1.c -ldl
gcc -Wall -shared -o test2.so test2.c
$ ./test1
Message: hello, world!
$

However, I don't know what I need to modify to make it work under OpenBSD.
You need to remove the '-dl' from the Makefile for it to compile, but then:

# make
gcc -Wall -rdynamic -o test1 test1.c
test1.c: In function `main':
test1.c:25: warning: assignment discards qualifiers from pointer target type
gcc -Wall -shared -o test2.so test2.c
# ./test1
./test1:./test2.so: undefined symbol 'bar'
Cannot load specified object
# 

Under Linux it seems that '-rdynamic' is the magic incantation, because
without this it also fails. However I don't know what the OpenBSD equivalent
is.

Could someone provide me with the necessary clue please?

Thanks,

Brian.

Reply via email to