PG_MODULE_MAGIC issue with small extension

From: Brent Douglas <brent(dot)n(dot)douglas(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: PG_MODULE_MAGIC issue with small extension
Date: 2016-09-02 14:51:34
Message-ID: CANYh1k3F6_9Siu9G1wD2_A61T1NjcfKwMghLLDPnssosF_2j3w@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hello all,

I'm not sure if this is the correct list for extensions, if not please let
me know where this should be sent too.

I have a mid sized append only table that is read fairly infrequently and
contains 2 columns that contain on average about 0.5Kb and 2Kb of xml per
row. In an attempt to same some space I am planning to deflate them with a
predefined dictionary (we have a set schema for the xml) as unfortunately
changing the table design to a more traditional structure is off the table.
In general the compression and decompression will be done in the
application layer but because we sometimes need to look at the content I am
writing some PG functions to inflate and deflate them with this dictionary.

What I have found however is that when I go to load my extensions I get
this error:

test=# create extension pg_zlib;

ERROR: incompatible library "/usr/local/lib/postgresql/pg_zlib.so":
missing magic block
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.

And I can't for the life of me work out why. As far as I understand them,
the docs indicate that this should only really happen if I'm compiling
against an 8.* headers. I'm on OSX el capitan, PG 9.5.3 (from brew), clang
is Apple LLVM version 7.3.0 (clang-703.0.31). I have manually checked all
the lib and include dirs and other than some suspicious looking ones in
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/
(which I removed) everything looks like it is correctly linked to the 9.5.3
version.

I don't regularly work in C and I've never worked on a PG extension before
so most of what I have is cobbled together by looking at what the mysql_fdw
extension does. If I'm missing something fundamental to either C or
extensions or if you can think of anything else I should check please let
me know.

I have inlined the output from `make install installcheck` and the relevant
parts of the files below. Thanks for you time and sorry about the
formatting.

Brent

make install installcheck

[~/work/pg_zlib (master)]$ make install installcheck || cat regression.diffs
clang -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-Wno-unused-command-line-argument -O2 -std=c11 -I. -I./
-I/usr/local/Cellar/postgresql/9.5.3/include/server
-I/usr/local/Cellar/postgresql/9.5.3/include/internal
-I/usr/local/opt/openssl/include -I/usr/local/opt/readline/include
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/libxml2
-c -o pg_zlib.o pg_zlib.c
pg_zlib.c:24:1: warning: type specifier missing, defaults to 'int'
[-Wimplicit-int]
PG_MODULE_MAGIC;
^
1 warning generated.
clang -Wall -Wmissing-prototypes -Wpointer-arith
-Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute
-Wformat-security -fno-strict-aliasing -fwrapv
-Wno-unused-command-line-argument -O2 -bundle -multiply_defined suppress
-Wl,-undefined,dynamic_lookup -o pg_zlib.so pg_zlib.o -L/usr/local/lib
-L/usr/local/opt/openssl/lib -L/usr/local/opt/readline/lib
-L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib
-Wl,-dead_strip_dylibs -bundle_loader
/usr/local/Cellar/postgresql/9.5.3/bin/postgres
/bin/sh
/usr/local/lib/postgresql/pgxs/src/makefiles/../../config/install-sh -c -d
'/usr/local/lib/postgresql'
/bin/sh
/usr/local/lib/postgresql/pgxs/src/makefiles/../../config/install-sh -c -d
'/usr/local/share/postgresql/extension'
/bin/sh
/usr/local/lib/postgresql/pgxs/src/makefiles/../../config/install-sh -c -d
'/usr/local/share/postgresql/extension'
/usr/bin/install -c -m 755 pg_zlib.so
'/usr/local/lib/postgresql/pg_zlib.so'
/usr/bin/install -c -m 644 .//pg_zlib.control
'/usr/local/share/postgresql/extension/'
/usr/bin/install -c -m 644 .//pg_zlib--1.0.sql
'/usr/local/share/postgresql/extension/'
/usr/local/lib/postgresql/pgxs/src/makefiles/../../src/test/regress/pg_regress
--inputdir=./ --bindir='/usr/local/Cellar/postgresql/9.5.3/bin'
--dbname=contrib_regression pg_zlib
(using postmaster on Unix socket, default port)
============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries ==============
test pg_zlib ... FAILED

======================
1 of 1 tests failed.
======================

The differences that caused some tests to fail can be viewed in the
file "/Users/bdouglas/work/pg_zlib/regression.diffs". A copy of the test
summary that you see
above is saved in the file "/Users/bdouglas/work/pg_zlib/regression.out".

make: *** [installcheck] Error 1
*** /Users/bdouglas/work/pg_zlib/expected/pg_zlib.out Thu Sep 1 23:59:01
2016
--- /Users/bdouglas/work/pg_zlib/results/pg_zlib.out Fri Sep 2 10:26:14
2016
***************
*** 0 ****
--- 1,3 ----
+ create extension pg_zlib;
+ ERROR: incompatible library "/usr/local/lib/postgresql/pg_zlib.so":
missing magic block
+ HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.

======================================================================

Makefile

MODULE_big = pg_zlib

OBJS = pg_zlib.o

EXTENSION = pg_zlib

DATA = pg_zlib--1.0.sql

REGRESS = pg_zlib

pg_zlib.o: override CFLAGS += -std=c11

PG_CONFIG = pg_config

PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)

pg_zlib--1.0.sql

create function inf(bytea)

returns text

as 'MODULE_PATHNAME'

language C strict;

create function def(text)

returns bytea

as 'MODULE_PATHNAME'
language C strict;

pg_zlib.control

comment = 'zlib extension for compressing and decompressing text'
default_version = '1.0'
module_pathname = '$libdir/pg_zlib'
relocatable = true

pg_zlib.c

#include "postgres.h"
#include "zlib.h"

#define CHUNK 16384
#define DICT_SIZE 32768

PG_MODULE_MAGIC;

text *
def(const bytea *in);

bytea *
inf(const text *in);

extern PGDLLEXPORT void _PG_init(void);

char *DICT;
size_t DICT_LEN;

void
_PG_init(void)
{
//Load dict
}

bytea *
inf(const text *in)
{
//inflate
}

text *
def(const bytea *in)
{
//deflate
}

sql/pg_zlib.sql

create extension pg_zlib;

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2016-09-02 15:07:53 Re: PG_MODULE_MAGIC issue with small extension
Previous Message dandl 2016-09-02 14:43:10 Re: UPDATE OR REPLACE?