Thread: Re: [PATCHES] Patch for Linux-IA64

Re: [PATCHES] Patch for Linux-IA64

From
Andreas Schwab
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:

|> The Makefile.shlib changes will have to be discussed with other Linux
|> developers so we are sure it will work on all platforms.

The problem with the current settings is that the linker is called
directly.  This is wrong, it should always be called through the compiler
driver (the only exception is `ld -r').  This will make sure that the
necessary libraries like libgcc are linked in.

But there is still a different problem with the setting of LDFLAGS_ODBC.
The psqlodbc module defines the functions _init and _fini which are
reserved for the shared library initialisation.  These should be changed
to constructor functions.  Then LDFLAGS_ODBC can be changed to be just
`-lm'.  Btw, why does it use -Bsymbolic?

Here is a patch to implement this:

--- src/Makefile.shlib
+++ src/Makefile.shlib    2000/07/05 16:51:27
@@ -145,9 +145,9 @@
 ifeq ($(PORTNAME), linux)
   install-shlib-dep    := install-shlib
   shlib                := lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
-  LDFLAGS_SL        := -Bdynamic -shared -soname $(shlib)
-  LDFLAGS_ODBC        := -Bsymbolic -lc -lm
-  SHLIB_LINK        += -lc
+  LD            := $(CC)
+  LDFLAGS_SL        := -shared -Wl,-soname,$(shlib)
+  LDFLAGS_ODBC        := -lm
   CFLAGS            += $(CFLAGS_SL)
 endif

--- src/interfaces/odbc/psqlodbc.c
+++ src/interfaces/odbc/psqlodbc.c    2000/07/06 10:01:04
@@ -33,8 +33,6 @@

 GLOBAL_VALUES globals;

-BOOL _init(void);
-BOOL _fini(void);
 RETCODE SQL_API SQLDummyOrdinal(void);

 #ifdef WIN32
@@ -96,6 +94,20 @@
 #ifndef FALSE
 #define FALSE    (BOOL)0
 #endif
+
+#ifdef __GNUC__
+
+/* This function is called at library initialization time.  */
+
+static BOOL
+__attribute__((constructor))
+init(void)
+{
+    getGlobalDefaults(DBMS_NAME, ODBCINST_INI, FALSE);
+    return TRUE;
+}
+
+#else

 /* These two functions do shared library initialziation on UNIX, well at least
  * on Linux. I don't know about other systems.

Andreas.

--
Andreas Schwab                                  "And now for something
SuSE Labs                                        completely different."
Andreas.Schwab@suse.de
SuSE GmbH, Schanzäckerstr. 10, D-90443 Nürnberg

Re: [PATCHES] Patch for Linux-IA64

From
Bruce Momjian
Date:
Applied.  Thanks.


[ Charset ISO-8859-1 unsupported, converting... ]
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
>
> |> The Makefile.shlib changes will have to be discussed with other Linux
> |> developers so we are sure it will work on all platforms.
>
> The problem with the current settings is that the linker is called
> directly.  This is wrong, it should always be called through the compiler
> driver (the only exception is `ld -r').  This will make sure that the
> necessary libraries like libgcc are linked in.
>
> But there is still a different problem with the setting of LDFLAGS_ODBC.
> The psqlodbc module defines the functions _init and _fini which are
> reserved for the shared library initialisation.  These should be changed
> to constructor functions.  Then LDFLAGS_ODBC can be changed to be just
> `-lm'.  Btw, why does it use -Bsymbolic?
>
> Here is a patch to implement this:
>
> --- src/Makefile.shlib
> +++ src/Makefile.shlib    2000/07/05 16:51:27
> @@ -145,9 +145,9 @@
>  ifeq ($(PORTNAME), linux)
>    install-shlib-dep    := install-shlib
>    shlib                := lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION).$(SO_MINOR_VERSION)
> -  LDFLAGS_SL        := -Bdynamic -shared -soname $(shlib)
> -  LDFLAGS_ODBC        := -Bsymbolic -lc -lm
> -  SHLIB_LINK        += -lc
> +  LD            := $(CC)
> +  LDFLAGS_SL        := -shared -Wl,-soname,$(shlib)
> +  LDFLAGS_ODBC        := -lm
>    CFLAGS            += $(CFLAGS_SL)
>  endif
>
> --- src/interfaces/odbc/psqlodbc.c
> +++ src/interfaces/odbc/psqlodbc.c    2000/07/06 10:01:04
> @@ -33,8 +33,6 @@
>
>  GLOBAL_VALUES globals;
>
> -BOOL _init(void);
> -BOOL _fini(void);
>  RETCODE SQL_API SQLDummyOrdinal(void);
>
>  #ifdef WIN32
> @@ -96,6 +94,20 @@
>  #ifndef FALSE
>  #define FALSE    (BOOL)0
>  #endif
> +
> +#ifdef __GNUC__
> +
> +/* This function is called at library initialization time.  */
> +
> +static BOOL
> +__attribute__((constructor))
> +init(void)
> +{
> +    getGlobalDefaults(DBMS_NAME, ODBCINST_INI, FALSE);
> +    return TRUE;
> +}
> +
> +#else
>
>  /* These two functions do shared library initialziation on UNIX, well at least
>   * on Linux. I don't know about other systems.
>
> Andreas.
>
> --
> Andreas Schwab                                  "And now for something
> SuSE Labs                                        completely different."
> Andreas.Schwab@suse.de
> SuSE GmbH, Schanz?ckerstr. 10, D-90443 N?rnberg
>


--
  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