Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 12 Feb 2001 21:35:57 -0500
From:      "Greg Galloway" <greggalloway@mindspring.com>
To:        <freebsd-questions@freebsd.org>
Subject:   freebsd 2.x shared objects
Message-ID:  <000901c09565$b54fdf40$2505a8c0@hotdog>

next in thread | raw e-mail | index | archive | help
I am trying to port an application from Solaris 2.6 to an embedded system
which is based on FreeBSD 2.x. The application supports dynamic updates
in the form of .so files which are loaded via dlopen.  The updates will
contain
functions which have the same name as functions in the main program.Under
FreeBSD 2.x dlopen seems to re-resolve these symbols to point to their
counterparts int the main app.  I've included a script which demonstrates
the
problem.

Under Solaris and FreeBSD 3.x and newer systems, this script produces:

    inside function() in main program
    inside function() in shared object

Under FreeBSD 2.x and SunOS 4.x, it produces:

    inside function() in main program
    inside function() in main program

Is this a limitation of a.out systems, or is there a workaround?

Unfortunately we cannot upgrade to a newer FreeBSD version at this time.

Thanks,
Greg
-----------------------------------------------------------
#!/bin/sh

cat <<EOF >main.c
#include <stdio.h>
#include <dlfcn.h>

void function()
{
    printf("inside function() in main program\n");
}

int main()
{
    void *handle;
    void (*pshared)();

    function();

    handle = dlopen("./libshared.so", RTLD_LAZY);
    if (!handle) exit(1);

    dlerror(); /* Clear error */
#ifdef __FreeBSD__
    pshared = (void(*)())dlsym(handle, "_shared");
#else
    pshared = (void(*)())dlsym(handle, "shared");
#endif
    if (dlerror()) exit(2);

    (*pshared)();

    dlclose(handle);

    return 0;
}
EOF

cat <<EOF >shared.c
extern void function();

void shared()
{
    function();
}
EOF

cat <<EOF >func.c
#include <stdio.h>

void function()
{
    printf("inside function() in shared object\n");
}
EOF

set -x

rm -f *.o *.so main

case `uname -s`-`uname -r` in
FreeBSD-2*)
 gcc -o main main.c
 gcc -fPIC -c shared.c
 gcc -fPIC -c func.c
 ld -Bshareable -o libshared.so shared.o func.o /usr/lib/c++rt0.o
 ;;
SunOS-4*)
 cc -o main main.c
 cc -PIC -c shared.c
 cc -PIC -c func.c
 ld -assert pure-text -o libshared.so shared.o func.o
 ;;
SunOS-5*)
 gcc -o main main.c
 gcc -fPIC -c shared.c
 gcc -fPIC -c func.c
 ld -shared -o libshared.so shared.o func.o
 ;;
esac

./main




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?000901c09565$b54fdf40$2505a8c0>