Return to BSD News archive
Path: sserve!newshost.anu.edu.au!harbinger.cc.monash.edu.au!msuinfo!agate!howland.reston.ans.net!EU.net!ieunet!news.ieunet.ie!jkh From: jkh@whisker.hubbard.ie (Jordan Hubbard) Newsgroups: comp.os.386bsd.questions Subject: Re: Dynamic C++ object with FreeBSD Date: 09 Jul 1994 15:20:51 GMT Organization: Jordan Hubbard Lines: 116 Distribution: world Message-ID: <JKH.94Jul9152051@whisker.hubbard.ie> References: <2vm9ib$kll@news-rocq.inria.fr> NNTP-Posting-Host: whisker.hubbard.ie In-reply-to: soulard@alix.inria.fr's message of 9 Jul 1994 13:43:39 GMT In article <2vm9ib$kll@news-rocq.inria.fr> soulard@alix.inria.fr (Herve Soulard) writes: I'm looking for an expert in both gcc and FreeBSD to give me some help in implementing dynamically loaded objects. This is easy.. Here, unpack and try the following shell archive - the make target will generate an executable called `example', just execute it. I suspect your difficulties lay in how you tried to generate the shared library to dynamically load - the Makefile I've included will show you how it's done. I also took the liberty of adding a few printf()'s to your code to show that it's working. --- Jordan # This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # Bar.cxx # Bar.hxx # Makefile # example.cxx # echo x - Bar.cxx sed 's/^X//' >Bar.cxx << 'END-of-Bar.cxx' X#include "Bar.hxx" X XBar::Bar(void) { X printf("BAR contructor!\n"); X i = 0; X} X XBar::~Bar(void) { X printf("BAR destructor!\n"); X} X Xint Bar::set(int a) { X printf("BAR set! a = %d\n", a); X i = a; X return i; X} X XBar* Bar::NEW(void) { X printf("BAR new!\n"); X return new Bar; X} END-of-Bar.cxx echo x - Bar.hxx sed 's/^X//' >Bar.hxx << 'END-of-Bar.hxx' Xclass Bar { X int i; Xpublic: X Bar(void); X ~Bar(void); X X virtual int set(int); X static Bar* NEW(void); X}; X END-of-Bar.hxx echo x - Makefile sed 's/^X//' >Makefile << 'END-of-Makefile' Xall: example X XCFLAGS += -fpic X Xexample: Bar.so X $(CXX) example.cxx -o example X X# Note that /usr/lib/c++rt0.o is NOT necessary for this example, but including X# it is a good habit to get into when making C++ shared libraries! If you're X# using the standard BSD make macros, simply set CPLUSPLUSLIB before X# including <bsd.lib.mk> to achieve the same effect. XBar.so: Bar.o X ld -Bshareable /usr/lib/c++rt0.o Bar.o -o Bar.so X Xclean: X rm -f *.o *.so example END-of-Makefile echo x - example.cxx sed 's/^X//' >example.cxx << 'END-of-example.cxx' X#include <stdio.h> X#include <sys/types.h> X#include <nlist.h> X Xextern "C" { X#include <link.h> X} X X#define PATH "./Bar.so" X X#include "Bar.hxx" X Xmain() X{ X void *addr; X void *(*fp)(void); X Bar *bar; X X addr = dlopen(PATH, 1); X fp = (void *(*)(void))dlsym(addr, "_NEW__3Bar"); Xprintf("addr = %x, fp = %x\n", addr, fp); X bar = (*fp)(); X X bar->set(3); X} END-of-example.cxx exit -- Jordan K. Hubbard FreeBSD core team Clams are your friends