diff --git a/src/backend/port/beos/support.c b/src/backend/port/beos/support.c
index bc5264e5490e295b789c1a094779e38d2010cde6..936c151e864119b78f6da2fb04bd9db68593f9d5 100644
--- a/src/backend/port/beos/support.c
+++ b/src/backend/port/beos/support.c
@@ -115,6 +115,22 @@ beos_dl_open(char *filename)
 	}
 }
 
+void
+beos_dl_sym(image_id im,char* symname,void** fptr)
+{
+	/* Send command '3' (get symbol) to the support server */
+	write_port(beos_dl_port_in, 3, symname, strlen(symname) + 1);
+	write_port(beos_dl_port_in, im, NULL,0);
+
+	/* Read sym address */
+	read_port(beos_dl_port_out, (int32*)(fptr), NULL, 0);
+
+	if (fptr==NULL)
+	{
+		elog(NOTICE, "loading symbol '%s' failed ", symname);
+	}
+}
+
 status_t
 beos_dl_close(image_id im)
 {
@@ -164,12 +180,13 @@ beos_startup(int argc, char **argv)
 			 * server
 			 */
 			read_port(port_in, &opcode, datas, 4000);
-
+			
 			switch (opcode)
 			{
 					image_id	addon;
 					image_info	info_im;
 					area_info	info_ar;
+					void  *     fpt;
 
 					/* Load Add-On */
 				case 1:
@@ -208,6 +225,33 @@ beos_startup(int argc, char **argv)
 					write_port(port_out, unload_add_on(*((int *) (datas))), NULL, 0);
 					break;
 					/* Cleanup and exit */
+				case 3:
+					
+					/* read image Id on the input port */
+					read_port(port_in, &addon,NULL,0);
+
+					/* Loading symbol */
+					fpt=NULL;
+					
+			
+				if (get_image_symbol(addon, datas, B_SYMBOL_TYPE_TEXT, &fpt) == B_OK);
+					{
+
+						/*
+						 * Sometime the loader return B_OK for an inexistant function
+						 * with an invalid address !!! Check that the return address
+						 * is in the image range
+			 			*/
+
+						get_image_info(addon, &info_im);
+						if ((fpt < info_im.text) ||(fpt >= (info_im.text +info_im.text_size)))
+							fpt=NULL;
+					}
+
+					/* Send back fptr of data segment */
+					write_port(port_out, (int32)(fpt),NULL,0);
+					break;
+								
 				default:
 					/* Free system resources */
 					delete_port(port_in);
diff --git a/src/backend/port/dynloader/beos.c b/src/backend/port/dynloader/beos.c
index dd28c5c5f810ecfeceb20733c81972fdf7a9e599..0a0f5fbef882197a07e79503281d2571d994f704 100644
--- a/src/backend/port/dynloader/beos.c
+++ b/src/backend/port/dynloader/beos.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/port/dynloader/Attic/beos.c,v 1.7 2001/03/22 03:59:42 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/port/dynloader/Attic/beos.c,v 1.8 2001/08/07 16:56:17 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -49,23 +49,8 @@ pg_dlsym(void *handle, char *funcname)
 	/* Checking that "Handle" is valid */
 	if ((handle) && ((*(int *) (handle)) >= 0))
 	{
-		/* Loading symbol */
-		if (get_image_symbol(*((int *) (handle)), funcname, B_SYMBOL_TYPE_TEXT, (void **) &fpt) == B_OK);
-		{
-
-			/*
-			 * Sometime the loader return B_OK for an inexistant function
-			 * with an invalid address !!! Check that the return address
-			 * is in the image range
-			 */
-			image_info	info;
-
-			get_image_info(*((int *) (handle)), &info);
-			if ((fpt < info.text) ||(fpt >= (info.text +info.text_size)))
-				return NULL;
-			return fpt;
-		}
-		elog(NOTICE, "loading symbol '%s' failed ", funcname);
+		beos_dl_sym(*((int *) (handle)),funcname,(void **) &fpt);
+		return fpt;
 	}
 	elog(NOTICE, "add-on not loaded correctly");
 	return NULL;
diff --git a/src/include/port/beos.h b/src/include/port/beos.h
index 654249545cd53894f48531382d244ce44fbf3c20..cedc5d6f12fdb9c2526202aff5add7bcb34e357c 100644
--- a/src/include/port/beos.h
+++ b/src/include/port/beos.h
@@ -1,5 +1,6 @@
 #include <kernel/OS.h>
-#include "kernel/image.h"
+#include <kernel/image.h>
+#include <sys/ioctl.h>
 
 #define HAS_TEST_AND_SET
 
@@ -69,6 +70,9 @@ void		beos_startup(int argc, char **argv);
 /* Load a shared library */
 image_id	beos_dl_open(char *filename);
 
+/* Find symbol */
+void 		beos_dl_sym(image_id im,char* symname,void** fptr);
+
 /* UnLoad a shared library */
 status_t	beos_dl_close(image_id im);