Hmm, it seems that -rdynamic is a non-standard flag here.

Use '-Wl,-E' or '-Wl,--export-dynamic'. Check the ld(1) man page
for '-E' and '--export-dynamic' options.

http://www.cim.mcgill.ca/~franco/OpSys-304-427/messages/node59.html

On Wed, Nov 29, 2006 at 03:52:37PM +0000, Brian Candler wrote:
> 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.
> 
Dale Rahn                               [EMAIL PROTECTED]

Reply via email to