*BSD News Article 32570


Return to BSD News archive

Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!msuinfo!agate!howland.reston.ans.net!pipex!sunic!trane.uninett.no!eunet.no!nuug!EU.net!julienas!news-rocq.inria.fr!alix.inria.fr!soulard
From: soulard@alix.inria.fr (Herve Soulard)
Newsgroups: comp.os.386bsd.questions
Subject: Dynamic C++ object with FreeBSD
Date: 9 Jul 1994 13:43:39 GMT
Organization: INRIA
Lines: 83
Distribution: world
Message-ID: <2vm9ib$kll@news-rocq.inria.fr>
Reply-To: soulard@sor.inria.fr
NNTP-Posting-Host: alix.inria.fr
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit


Hello,

I'm looking for an expert in both gcc and FreeBSD to give me some
help in implementing dynamically loaded objects.

Here is what I want to do.

I have the following class in Bar.hxx:


	class Bar {
		int i;
	public:
		Bar(void);
		~Bar(void);

		virtual int set(int);
		static Bar* NEW(void);
	};

and its code in Bar.cxx:

	#include "Bar.hxx"
	
	Bar::Bar(void) {
		i = 0;
	}

	Bar::~Bar(void) {
	}

	int Bar::set(int a) {
		i = a;
		return i;
	}		

	Bar* Bar::NEW(void) {
		return new Bar;
	}

and a test:

	#include <stdio.h>
	#include <sys/types.h>
	#include <nlist.h>

	extern "C" {
	#include <link.h>
	}

	#define PATH "./bar.so"

	#include "bar.hxx"

	main()
	{
	    void *addr;
	    void *(*fp)(void);
	    Bar  *bar;

	    addr = dlopen(PATH, 1);
	    fp = (void *(*)(void))dlsym(addr, "_NEW__3Bar");

	    bar = (*fp)();

	    bar->set(3);
	}

This code works on SunOS with CC and on OSF1 with cxx (with some change
to includes and mangled symbol for NEW).

I would like to make it works on FreeBSD with gcc. But I cannot get it.
Does somebody know which option to gcc and to ld I must give, and if
I usec correctly the dl functions.

		Herve Soulard.

PS: I would prefer email answers.