Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re^3: "referenced symbol not found" testing DBD::ODBC against unixODBC

by arielCo (Sexton)
on Apr 17, 2013 at 00:07 UTC ( #1029029=note: print w/ replies, xml ) Need Help??


in reply to Re^2: "referenced symbol not found" testing DBD::ODBC against unixODBC
in thread "referenced symbol not found" testing DBD::ODBC against unixODBC

GOT IT. For anyone interested:

  1. In Solaris, run the shell with perlgcc and configure CPAN for GCC:
    o conf make /usr/sfw/bin/gmake o conf make_arg '' o conf make_install_arg '' o conf make_install_make_command '/usr/sfw/bin/gmake' o conf mbuild_arg '' o conf mbuild_install_arg '' o conf tar /usr/sfw/bin/gtar
    (Maybe some of these options are irrelevant - feel free to correct me)
  2. In makepl_arg:
    • Don't add 'LIBS=-L /your_unixodbc_home/lib'; use '-o /your_unixODBC_home', or just export UNIXODBC=/your_unixODBC_home before running the CPAN shell - Makefile.PL will set -L and -l for you.
    • To avoid using the dreaded LD_LIBRARY_PATH, add 'LDDLFLAGS="-Wl,-rpath,your_unixODBC_home/lib -G"' to makepl_arg. This will tell GCC to tell ld to add the location of your ODBC libraries to the runtime path (RPATH). Because you're overriding the LDDLFLAGS, you need to add "-G" so that GCC produces a shared object.
    • So, this incantation should work:

       o conf makepl_arg 'LDDLFLAGS="-G -Wl,-rpath,/your_unixodbc_home/lib" -o /your_unixodbc_home'

Note: in my setup, I had to issue o conf commit, exit the shell and run it again for these changes to work. Don't ask.

Note 2: Turns out that the relocation error happened because ld.so.1 was loading the *wrong* library from /my_unixodbc_home/lib. I got the clue from 'Enabling ODBC support in Perl with Perl DBI and DBD::ODBC' by Easysoft:

The undefined symbol SQLParamData is reported by the dynamic linker as the first symbol it looked for but could not find.

This happens when building DBD::ODBC with unixODBC because the Makefile.PL is now incompatible with newer unixODBC releases. The Makefile.PL searches ODBCHOME/lib for *odbc*.* and finds libodbc.so AND libodbcinst.so. It then goes on to choose libodbcinst.so which is the incorrect shared object.


Comment on Re^3: "referenced symbol not found" testing DBD::ODBC against unixODBC
Select or Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1029029]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (2)
As of 2015-07-06 01:11 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (68 votes), past polls