I'm having difficulty linking a custom external C function into MonetDB without crashing the database connection.  If anyone knows of a documented end-to-end example of adding external functions compiled with GCC, please let me know.  I've documented a minimal example below that crashes the connection for me each time. 
 
 
Software:
Red Hat Linux knock-off CentOS, i386.
Most recent MonetDB download from Sourceforge (server 5.2.2, client 1.20.2, common 1.20.0).
GCC 4.1.1
 
1.  Create a simple C file named te.c.  
 
int
TEtest( )
{
return 4;
}
 
2.  Compile file, move it to the proper directory, and create symlinks.
 
$  gcc -c -fPIC te.c -o te.o
$  gcc -shared -Wl,-soname,lib_te.so.0 -o lib_te.so.0.0.0 te.o   (also tried with soname = libte.so.0, leaving output as lib_te.so.0.0.0)
$  cp lib_te.so.0.0.0 $mhome/lib/MonetDB5/lib
$  cd $mhome/lib/MonetDB5/lib
$  ln -s lib_te.so.0.0.0 lib_te.so.0
$  ln -s lib_te.so.0.0.0 lib_te.so
 
3.  Create a MAL file, saved as $mhome/lib/MonetDB5/te.mal
 
module te;
 
command test( ):int
address TEtest();
 
command doesnotexist( ):int
address TEdoesnotexist;
 
4.  Update mal_init.mal by adding the following 2 lines:
 
library te;
include te;
 
5.  Start a random DB and try to invoke the test function.  Merovingian log show database dino killed by signal 11 afterwards.
 
$  cd $mhome/bin
 
$ ./merovingian &
[1] xxxx
 
$  ./mclient -lmal --database=dino -h COS1
mal> te.test( );
MAPI = monetdb@COS1:50001
ACTION= read_line
QUERY = te.test();
ERROR = Connection terminated
 
 
If I instead invoke te.doesnotexist(), I get a different error (below.)  This leads me to think that MonetDB is findng and loading my compiled .so file, but it wasn't compiled correctly or otherwise isn't providing what MonetDB expects.
 
mal> te.doesnotexist();
MAPI = monetdb@COS1:50001
QUERY = te.doesnotexist();
ERROR = !TypeException:user.main[1]:'te.doesnotexist' undefined in: _1:int := te.doesnotexist()
 
Any pointers are appreciated.
 
Thomas Schulte