[unixODBC-support] Unixodbc crashing on ubuntu-8.04, under static linkage

Peter Harvey pharvey at peterharvey.org
Mon Dec 1 23:31:51 GMT 2008


Great info but could you post this to the unixodbc-dev mailing list? See
www.unixodbc.org

Thanks!
Peter

> -----Original Message-----
> From: unixodbc-support-bounces at mailman.unixodbc.org [mailto:unixodbc-
> support-bounces at mailman.unixodbc.org] On Behalf Of Michael Smolsky
> Sent: Monday, December 01, 2008 2:03 PM
> To: unixodbc-support at mailman.unixodbc.org
> Subject: [unixODBC-support] Unixodbc crashing on ubuntu-8.04, under
> static linkage
> 
> Hello,
> 
> First of all, thank you for supporting a very useful product.
> 
> I'm using unix-odbc on Ubuntu 8.04, x86_64, that is in the fully
> updated state. I have the following unixodbc packages installed:
> 
> unixodbc        2.2.11-16build1
> unixodbc-dev    2.2.11-16build1
> odbc-postgresql 1:08.01.0200-2.1
> 
> Gcc's version is 4.2.4 (Ubuntu 4.2.4-1ubuntu3).
> 
> I'm using postgres 8.3.5 for my database server. The server runs
> locally.
> 
> I have a problem with my app, that is built around unixodbc. When the
> app is linked dynamically against unixodbc (besides other libs), it
> works fine. However, when my app is linked statically, it crashes.
> 
> I've isolated the problem and wrote up a fairly simple app, that
> illustrates the issue. The contents of the file odbc_connect.c is
> included in this message. To compile, I use the following command lines
> (there is no makefile in this directory):
> 
> To build the app statically (and observe the crash):
> 
> rm -f ./odbc_connect; make CFLAGS="-Wall" LDFLAGS="-static"
> LOADLIBES="-lodbc -lltdl -ldl -lpthread" ./odbc_connect &&
> ./odbc_connect
> 
> To build the same app dynamically (and see no crash), use the same
> command line, but eliminate LDFLAGS="-static" string from it.
> 
> When not crashing (under dynamic linkage), the app produces the
> following output:
> 
> $ rm -f odbc_connect; make CFLAGS="-Wall" LOADLIBES="-lodbc -lltdl -ldl
> -lpthread" odbc_connect && ./odbc_connect
> cc -Wall    odbc_connect.c -lodbc -lltdl -ldl -lpthread  -o
> odbc_connect
> INFO: Allocated handle for the environment.
> INFO: Set ODBC environment's version attribute.
> INFO: Allocated handle for the connection.
> INFO: Connected to the data source.
> INFO: Disconnected from data source.
> INFO: Freed handle for the connection.
> INFO: Freed handle for the environment.
> INFO: Exiting with success.
> 
> When crashing, the app produces the following output:
> 
> $ rm -f odbc_connect; make CFLAGS="-Wall" LDFLAGS="-static"
> LOADLIBES="-lodbc -lltdl -ldl -lpthread" odbc_connect && ./odbc_connect
> cc -Wall  -static  odbc_connect.c -lodbc -lltdl -ldl -lpthread  -o
> odbc_connect
> /usr/lib/gcc/x86_64-linux-gnu/4.2.4/../../../../lib/libltdl.a(ltdl.o):
> In function `sys_dl_open':
> (.text+0x3687): warning: Using 'dlopen' in statically linked
> applications requires at runtime the shared libraries from the glibc
> version used for linking
> /usr/lib/gcc/x86_64-linux-
> gnu/4.2.4/../../../../lib/libodbc.a(_odbcinst_UserINI.o): In function
> `_odbcinst_UserINI':
> (.text+0x3c): warning: Using 'getpwuid' in statically linked
> applications requires at runtime the shared libraries from the glibc
> version used for linking
> INFO: Allocated handle for the environment.
> INFO: Set ODBC environment's version attribute.
> INFO: Allocated handle for the connection.
> Segmentation fault
> 
> Obviously, one can see, that the linker is also not quite happy, when
> linking statically.
> 
> Here's the backtrace of the crash:
> 
> (gdb) r
> Starting program: /bla/bla/bla/odbc_connect
> [Thread debugging using libthread_db enabled]
> INFO: Allocated handle for the environment.
> INFO: Set ODBC environment's version attribute.
> INFO: Allocated handle for the connection.
> [New Thread 0x6fa860 (LWP 15533)]
> 
> Program received signal SIGSEGV, Segmentation fault.
> [Switching to Thread 0x6fa860 (LWP 15533)]
> 0x0000000000000000 in ?? ()
> (gdb) bt
> #0  0x0000000000000000 in ?? ()
> #1  0x00007f8b3d7696c2 in __pthread_initialize_minimal_internal ()
>    from /lib/libpthread.so.0
> #2  0x00007f8b3d768e19 in _init () from /lib/libpthread.so.0
> #3  0x000000000071a820 in ?? ()
> #4  0x000000000049dad6 in call_init ()
> #5  0x000000000049dc56 in _dl_init ()
> #6  0x000000000047dbac in dl_open_worker ()
> #7  0x000000000047bfc6 in _dl_catch_error ()
> #8  0x000000000047d430 in _dl_open ()
> #9  0x000000000046480c in dlopen_doit ()
> #10 0x000000000047bfc6 in _dl_catch_error ()
> #11 0x0000000000464c01 in _dlerror_run ()
> #12 0x000000000046478e in __dlopen ()
> #13 0x0000000000441c7b in sys_dl_open ()
> #14 0x000000000043f9c5 in tryall_dlopen ()
> #15 0x0000000000441154 in try_dlopen ()
> #16 0x00000000004419bd in lt_dlopen ()
> #17 0x0000000000402b45 in odbc_dlopen ()
> #18 0x00000000004037fb in __connect_part_one ()
> #19 0x0000000000407954 in SQLDriverConnect ()
> #20 0x00000000004004c5 in main ()
> (gdb)
> 
> I believe, I had the same issue with Fedora Core 7, but I am not
> running this OS any more and cannot reproduce the issue.
> 
> I would appreciate it, if you could advise me what I'm doing wrong.
> 
> Thank you in advance,
> 
> Mike.
> 
> PS: Here's my app:
> 
> -------------BEGIN odbc_connect.c-------------
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> 
> #include <sql.h>
> #include <sqlext.h>
> 
> int isOk(SQLRETURN ret) {
> 
>   return SQL_SUCCESS == ret || SQL_SUCCESS_WITH_INFO == ret;
> 
> } /* of isOk(..) */
> 
> int main() {
> 
>   char DATA_SOURCE[] = "DSN=testdb;UID=siguc;";
>   SQLCHAR* sqlDataSource = 0;
> 
>   SQLHENV env = SQL_NULL_HENV;
> 
>   SQLHDBC dbc = SQL_NULL_HDBC;
> 
>   SQLCHAR completeConnectionString[SQL_MAX_OPTION_STRING_LENGTH];
> 
>   SQLSMALLINT completeConnectionStringLen;
> 
>   SQLRETURN ret;
> 
>   int i;
> 
>   ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
> 
>   if (!isOk(ret)) {
>     printf("ERROR: Failed to allocate handle for the environment,
> exiting.\n");
>     exit(1);
>   } else {
>     printf("INFO: Allocated handle for the environment.\n");
>   }
> 
>   ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3,
> 0);
> 
>   if (!isOk(ret)) {
>     printf
>       ("ERROR: Failed to set ODBC environment's version attribute,
> exiting.\n");
>     exit(1);
>   } else {
>     printf("INFO: Set ODBC environment's version attribute.\n");
>   }
> 
>   ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
> 
>   if (!isOk(ret)) {
>     printf("ERROR: Failed to allocate handle for the connection,
> exiting.\n");
>     exit(1);
>   } else {
>     printf("INFO: Allocated handle for the connection.\n");
>   }
> 
>   sqlDataSource = (SQLCHAR*) malloc(sizeof(SQLCHAR) *
> (strlen(DATA_SOURCE) + 1));
> 
>   if (!sqlDataSource) {
>     printf("Failed to allocate memory for storing SQL data source.\n");
>     exit(1);
>   }
> 
>   for (i = 0; i < strlen(DATA_SOURCE); ++ i)
>     sqlDataSource[i] = DATA_SOURCE[i];
> 
>   sqlDataSource[strlen(DATA_SOURCE)] = 0;
> 
>   ret = SQLDriverConnect
>     (dbc,                       /* Connection handle. */
>      NULL,                      /* Always null. Not used. */
>      &sqlDataSource[0],         /* Connection string. */
>      SQL_NTS,                   /* The connection string is null-
> terminated. */
>      completeConnectionString,  /* The complete connection string
> (returned). */
>      sizeof(completeConnectionString) /
> sizeof(completeConnectionString[0]),
>      &completeConnectionStringLen,   /* Returned. */
>      SQL_DRIVER_COMPLETE             /* What the hell is this? */
>      );
> 
>   if (!isOk(ret)) {
>     printf("ERROR: Failed to connect to the data source, exiting.\n");
>     exit(1);
>   } else {
>     printf("INFO: Connected to the data source.\n");
>   }
> 
>   free(sqlDataSource);
>   sqlDataSource = 0;
> 
>   ret = SQLDisconnect(dbc);
> 
>   if (!isOk(ret)) {
>     printf("ERROR: Failed to connect from the data source,
> exiting.\n");
>     exit(1);
>   } else {
>     printf("INFO: Disconnected from data source.\n");
>   }
> 
>   ret = SQLFreeHandle(SQL_HANDLE_DBC, dbc);
> 
>   if (!isOk(ret)) {
>     printf("ERROR: Failed to free handle for the connection,
> exiting.\n");
>     exit(1);
>   } else {
>     printf("INFO: Freed handle for the connection.\n");
>   }
> 
>   dbc = SQL_NULL_HDBC;
> 
>   ret = SQLFreeHandle(SQL_HANDLE_ENV, env);
> 
>   if (!isOk(ret)) {
>     printf("ERROR: Failed to free handle for the environment,
> exiting.\n");
>     exit(1);
>   } else {
>     printf("INFO: Freed handle for the environment.\n");
>   }
> 
>   env = SQL_NULL_HENV;
> 
>   printf("INFO: Exiting with success.\n");
> 
>   return 0;
> 
> } /* of main(..) */
> 
> -------------END odbc_connect.c-------------
> 
> --
> Be Yourself @ mail.com!
> Choose From 200+ Email Addresses
> Get a Free Account at www.mail.com
> 
> _______________________________________________
> unixODBC-support mailing list
> unixODBC-support at mailman.unixodbc.org
> http://mailman.unixodbc.org/mailman/listinfo/unixodbc-support



More information about the unixODBC-support mailing list