Thread

  1. Re: [GENERAL] plpgsql problem: relocation error

    selkovjr@mcs.anl.gov — 1999-11-05T04:31:00Z

    > Greetings.
    > 
    > Using pg6.5.1 on Solaris 2.6, I'm trying to create a very simple function
    > using plpgsql.  Here's the code I've executed:
    > 
    > /*
    > CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS
    >     '/opt/pgsql/lib/plpgsql.so' LANGUAGE 'C';
    > 
    > CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
    >     HANDLER plpgsql_call_handler
    >     LANCOMPILER 'PL/pgSQL';
    > */
    > 
    > CREATE FUNCTION bool(int2) returns bool as
    > 'begin
    > 	if $1 = 1 or $1 = -1 then
    > 	   RETURN t;
    > 	else
    > 	   RETURN f;
    > 	end if;
    > end;'
    > language 'plpgsql';
    > 
    > All of this loads fine. 
    
    In fact, nothing loads at this point. The function and the shared
    object where it is contained simply become known to postgres.
    
    
    > However, when I test the function, this is what
    > happens:
    > 
    > demogdata=> select bool(-1);
    > ERROR:  Load of file /opt/pgsql/lib/plpgsql.so failed: ld.so.1:
    > /opt/pgsql/bin/postmaster: fatal: relocation error: file
    > /opt/pgsql/lib/plpgsql.so: symbol CurrentMemoryContext: referenced symbol
    > not found
    
    I do not know a thing about plpgsql, but I have just returned from a
    hacking session in SunOS5.6 where I saw this very error being the
    result of inappropriate compiler and linker options. Most notably, the
    object files must be position-independent (-fPIC). Take a look at the
    actual Makefile I ended up using (SunOS 5.6 should be identical to
    Solaris 2.6)
    
    ============================================================
    
    SRCDIR= /appl/spinosa/Package_sources/postgresql-6.5.2/src
    include $(SRCDIR)/Makefile.global
    
    CFLAGS+= -fPIC -I$(LIBPQDIR) -I$(SRCDIR)/include
    
    #
    # DLOBJS is the dynamically-loaded object files.  The "funcs" queries
    # include CREATE FUNCTIONs that load routines from these files.
    #
    DLOBJS= ec$(DLSUFFIX) 
    
    ifdef EXPSUFF
    DLOBJS+= $(DLOBJS:.o=$(EXPSUFF))
    endif
    
    all: $(DLOBJS)
    
    $(DLOBJS): ec.o
            $(CC) -G -dynamic -o ec.so ec.o
    
    clean:
            rm -f $(DLOBJS)
            rm -f *.o *~ *#
    
    ============================================================
    
    If it's not gcc that you are using, I think you should look for
    further clues in
    
    http://www.postgresql.org/docs/programmer/dfunc1976.htm
    
    
    --Gene