Thread: Problem Building Cygwin PostgreSQL

Problem Building Cygwin PostgreSQL

From
Jason Tishler
Date:
I am attempting to build PostgreSQL 7.0.2 on a stock Cygwin 1.1.4
distribution.  When building plpgsql.dll, I get the following error:

    dllwrap -o plpgsql.dll --dllname plpgsql.dll --def plpgsql.def \
    pl_parse.o pl_han dler.o pl_comp.o pl_exec.o pl_funcs.o \
    ../../../utils/dllinit.o  -L/usr/local/lib -L/usr/local/lib \
    -L../../../backend -lpostgres -lcygipc -lcygwin -lcrypt -lkernel32
    pl_exec.o(.text+0x1e56):pl_exec.c: undefined reference to `fmgr_pl_finfo'
    pl_exec.o(.text+0x32a1):pl_exec.c: undefined reference to `fmgr_pl_finfo'
    pl_exec.o(.text+0x32bd):pl_exec.c: undefined reference to `fmgr_pl_finfo'
    collect2: ld returned 1 exit status

Searching the Net, I found the following on the pgsql-ports list:

    http://www.postgresql.org/mhonarc/pgsql-ports/2000-08/msg00045.html

which demonstrates that at least one other person had exactly the same
problem.  Unfortunately, the solution given was not applicable.

Has anyone been successful building a Cygwin PostgreSQL 7.0.2?  If so,
what is the solution to the above problem?

Thanks,
Jason

--
Jason Tishler
Director, Software Engineering       Phone: +1 (732) 264-8770 x235
Dot Hill Systems Corporation         Fax:   +1 (732) 264-8798
82 Bethany Road, Suite 7             Email: Jason.Tishler@dothill.com
Hazlet, NJ 07730 USA                 WWW:   http://www.dothill.com

Re: Problem Building Cygwin PostgreSQL

From
Jason Tishler
Date:
Volker,

On Thu, Sep 21, 2000 at 06:49:22PM +0200, Dr. Volker Zell wrote:
> I have the same problem. Anyway postmaster -i works perfect and the
> database system starts up fine.

Thanks for the heads up -- with my very limited testing my Cygwin PostgreSQL
build seems to be working correctly.

> But using psql always results in a
> stacktrace. Can you check if you get the same behaviour.

So far (meaning working through some of the tutorial) psql works without
stackdumping.  However, it does stackdump whenever I execute 'psql --help'.

Jason

--
Jason Tishler
Director, Software Engineering       Phone: +1 (732) 264-8770 x235
Dot Hill Systems Corporation         Fax:   +1 (732) 264-8798
82 Bethany Road, Suite 7             Email: Jason.Tishler@dothill.com
Hazlet, NJ 07730 USA                 WWW:   http://www.dothill.com

Re: Problem Building Cygwin PostgreSQL

From
Jason Tishler
Date:
Volker,

On Thu, Sep 21, 2000 at 05:02:11PM -0400, Jason Tishler wrote:
> However, it does stackdump whenever I execute 'psql --help'.

The above was caused by the following in src/bin/psql/help.c:

    void
    usage(void)
    {
        ...
    #ifndef WIN32
        if (pw)
            free(pw);
    #endif
    }

Changing the above #ifndef to:

    #if !defined(WIN32) && !defined(__CYGWIN__)

fixed this niggling crash.

Jason

--
Jason Tishler
Director, Software Engineering       Phone: +1 (732) 264-8770 x235
Dot Hill Systems Corporation         Fax:   +1 (732) 264-8798
82 Bethany Road, Suite 7             Email: Jason.Tishler@dothill.com
Hazlet, NJ 07730 USA                 WWW:   http://www.dothill.com

Re: Problem Building Cygwin PostgreSQL

From
Jason Tishler
Date:
Earnie,

On Fri, Sep 22, 2000 at 11:01:25AM -0700, Earnie Boyd wrote:
> Hmm...  This appears that it would potentially cause a memory leak.  What
> happens if instead of this patch you initialize the pointer to NULL?

I guess that I should have giving more context:

    void
    usage(void)
    {
        ...
        user = getenv("USER");
        if (!user)
        {
    #ifndef WIN32
            pw = getpwuid(geteuid());
            if (pw)
                user = pw->pw_name;
            ...
    #else
            user = "?";
    #endif
        }
        ...
    #if !defined(WIN32) && !defined(__CYGWIN__)
        if (pw)
            free(pw);
    #endif
    }

The relevant Cygwin source (i.e., src/winsup/cygwin/passwd.cc) and the
getpwuid() man page (from Solaris):

    The  functions  getpwnam(),  getpwuid(),   getpwent(),   and
    fgetpwent() use *static* storage that is re-used in each call,
    making these routines unsafe for use in multithreaded appli-
    cations.

seemed to indicate that free-ing the return value from getpwuid() was a
bad idea.  Can someone confirm or refute this supposition?

Thanks,
Jason

--
Jason Tishler
Director, Software Engineering       Phone: +1 (732) 264-8770 x235
Dot Hill Systems Corporation         Fax:   +1 (732) 264-8798
82 Bethany Road, Suite 7             Email: Jason.Tishler@dothill.com
Hazlet, NJ 07730 USA                 WWW:   http://www.dothill.com

Re: Problem Building Cygwin PostgreSQL

From
Jason Tishler
Date:
On Thu, Sep 21, 2000 at 11:55:38AM -0400, Jason Tishler wrote:
> I am attempting to build PostgreSQL 7.0.2 on a stock Cygwin 1.1.4
> distribution.  When building plpgsql.dll, I get the following error:
>
>     dllwrap -o plpgsql.dll --dllname plpgsql.dll --def plpgsql.def \
>     pl_parse.o pl_han dler.o pl_comp.o pl_exec.o pl_funcs.o \
>     ../../../utils/dllinit.o  -L/usr/local/lib -L/usr/local/lib \
>     -L../../../backend -lpostgres -lcygipc -lcygwin -lcrypt -lkernel32
>     pl_exec.o(.text+0x1e56):pl_exec.c: undefined reference to `fmgr_pl_finfo'
>     pl_exec.o(.text+0x32a1):pl_exec.c: undefined reference to `fmgr_pl_finfo'
>     pl_exec.o(.text+0x32bd):pl_exec.c: undefined reference to `fmgr_pl_finfo'
>     collect2: ld returned 1 exit status

After much head banging and web surfing, I finally fixed the plpgsql.dll
build problem.  I was pointed in the right direction by Joost Kraaijeveld.
The solution was to change Gen_fmgrtab.sh.in, which generates fmgr.h,
as follows:

    diff Gen_fmgrtab.sh.in.orig Gen_fmgrtab.sh.in
    139c139,144
    < extern FmgrInfo        *fmgr_pl_finfo;
    ---
    > #ifdef BUILDING_DLL
    > #define DLL_INTERFACE __declspec(dllexport)
    > #else
    > #define DLL_INTERFACE __declspec(dllimport)
    > #endif
    > extern DLL_INTERFACE FmgrInfo *fmgr_pl_finfo;

fmgr_pl_finfo is data and not a function, so I guess that it needs to be
explicitly imported/exported via __declspec(dllimport)/__declspec(dllexport),
respectively.

Does anyone know whether or not older Cygwin versions of binutils
automatically exported data items?

Thanks,
Jason

--
Jason Tishler
Director, Software Engineering       Phone: +1 (732) 264-8770 x235
Dot Hill Systems Corporation         Fax:   +1 (732) 264-8798
82 Bethany Road, Suite 7             Email: Jason.Tishler@dothill.com
Hazlet, NJ 07730 USA                 WWW:   http://www.dothill.com

Re: Problem Building Cygwin PostgreSQL

From
Jason Tishler
Date:
On Thu, Sep 21, 2000 at 06:49:22PM +0200, Dr. Volker Zell wrote:
> But using psql always results in a stacktrace.

FYI, I have determined that Volker's psql crashes were due to the
linking with multiple instances of libcygwin.a problem.  It was libm.a
in this case.

Jason

--
Jason Tishler
Director, Software Engineering       Phone: +1 (732) 264-8770 x235
Dot Hill Systems Corporation         Fax:   +1 (732) 264-8798
82 Bethany Road, Suite 7             Email: Jason.Tishler@dothill.com
Hazlet, NJ 07730 USA                 WWW:   http://www.dothill.com

Re: Re: Problem Building Cygwin PostgreSQL

From
Bruce Momjian
Date:
Looks like this is fixed in current sources.

> Earnie,
>
> On Fri, Sep 22, 2000 at 11:01:25AM -0700, Earnie Boyd wrote:
> > Hmm...  This appears that it would potentially cause a memory leak.  What
> > happens if instead of this patch you initialize the pointer to NULL?
>
> I guess that I should have giving more context:
>
>     void
>     usage(void)
>     {
>         ...
>         user = getenv("USER");
>         if (!user)
>         {
>     #ifndef WIN32
>             pw = getpwuid(geteuid());
>             if (pw)
>                 user = pw->pw_name;
>             ...
>     #else
>             user = "?";
>     #endif
>         }
>         ...
>     #if !defined(WIN32) && !defined(__CYGWIN__)
>         if (pw)
>             free(pw);
>     #endif
>     }
>
> The relevant Cygwin source (i.e., src/winsup/cygwin/passwd.cc) and the
> getpwuid() man page (from Solaris):
>
>     The  functions  getpwnam(),  getpwuid(),   getpwent(),   and
>     fgetpwent() use *static* storage that is re-used in each call,
>     making these routines unsafe for use in multithreaded appli-
>     cations.
>
> seemed to indicate that free-ing the return value from getpwuid() was a
> bad idea.  Can someone confirm or refute this supposition?
>
> Thanks,
> Jason
>
> --
> Jason Tishler
> Director, Software Engineering       Phone: +1 (732) 264-8770 x235
> Dot Hill Systems Corporation         Fax:   +1 (732) 264-8798
> 82 Bethany Road, Suite 7             Email: Jason.Tishler@dothill.com
> Hazlet, NJ 07730 USA                 WWW:   http://www.dothill.com
>


--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026