I've been working on creating a foreign data wrapper for hdfs on using version 9.1.0. This is my first time creating C functions against postgres, so hopefully this falls under the 'newbie' category and is easy to solve. The source code code does compile resulting in a shared library: file mylibrary.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped ldd mylibrary.so linux-vdso.so.1 => (0x00007fff40fff000) libc.so.6 => /lib/libc.so.6 (0x00007f3adb8cc000) /lib64/ld-linux-x86-64.so.2 (0x00007f3adbe72000) But, the library fails to load when I use the LOAD statement: LOAD mylibrary.so The error is: ERROR: could not load library "mylibrary.so": mylibrary.so: undefined symbol: hdfsConnect I already figured it needs to recognize the hadoop shared library, libhdfs.so.0 but loading hdfs directly, of course, results in the following error: ERROR: incompatible library "/home/robert/lib/libhdfs.so.0": missing magic block HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro. So how do I manage to load hdfs? All that is required at this point for the data wrapper to do is to open and read a very small file. Here's the snippet in question: ///////////////////////////////////////////////////////////////////// #include "hdfs.h" #include <string.h> #include <stdio.h> #include "postgres.h" #include "fmgr.h" #include "funcapi.h" #include "foreign/fdwapi.h" #include "foreign/foreign.h" #include "commands/explain.h" #include "commands/defrem.h" #include "catalog/pg_foreign_table.h" PG_MODULE_MAGIC; typedef struct { char *connection, *filename, *limit, *offset; hdfsFS *fs; hdfsFile *fp; } hdfsFdwExecutionState; extern Datum hdfs_fdw_handler(PG_FUNCTION_ARGS); . . . // here's where the function "hdfsConnect" is first called static void hdfsBeginForeignScan(ForeignScanState *node, int eflags) { hdfsFdwExecutionState *festate; char *recordset = malloc(LINE_LENGTH*sizeof(*recordset)), *connection = "default", *filename, *limit, *offset; hdfsFS fs; hdfsFile fp; if (eflags & EXEC_FLAG_EXPLAIN_ONLY) return; hdfsGetOptions(RelationGetRelid(node->ss.ss_currentRelation), &filename, &limit, &offset); festate = (hdfsFdwExecutionState *) palloc(sizeof(hdfsFdwExecutionState)); fs = hdfsConnect(connection, 0); fp = setFILEoffset(fs, filename, offset); festate->filename = filename; festate->limit = limit; festate->offset = offset; festate->fs = fs; festate->fp = (void *) fp; node->fdw_state = (void *) festate; } ///////////////////////////////////////////////////////////////////// -- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general