RE: make test: dlopen error :can't load library ODBC.so

Chunmei Wu <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <7dae1990-ac91-42e0-9336-4b3a329f5790@default>
Hi Martin, Reinhard and Jens,

Thanks for your advice. Following is related info you referred:

1> Are all the components in your chain (perl, driver manager, driver) all64 bit? 
[Chunmei]: The unixODBC driver and the DB2 driver are 64bit. Seems that my perl is 32bit from following info. Is this the reason for my error????
	unixuser\@dsliaa05 # > file perl
	perl: executable (RISC System/6000) or object module

2> What does perl -V output?
Summary of my perl5 (revision 5.0 version 8 subversion 0) configuration:
  Platform:
    osname=aix, osvers=4.1.4.0, archname=aix
    uname='aix cyclops 1 4 00051664a000 '
    config_args='-des [email protected] [email protected] -Dcf_by=IndigoSTAR -Uinstallusrbinperl'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef use5005threads=undef useithreads=undef usemultiplicity=undef
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_ALL_SOURCE -D_ANSI_C_SOURCE -D_POSIX_SOURCE -qmaxmem=16384 -qnoansialias',
    optimize='-O',
    cppflags=''
    ccversion='3.1.3.3', gccversion='', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=4321
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=8
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=4
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='ld', ldflags =''
    libpth=/lib /usr/lib /usr/ccs/lib
    libs=-ldbm -lld -lm -lC -lc -lbsd -lPW
    perllibs=-lld -lm -lC -lc -lbsd -lPW
    libc=, so=a, useshrplib=false, libperl=libperl.a
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_aix.xs, dlext=so, d_dlsymun=undef, ccdlflags='  -bE:/opt/lib/perl5/5.8.0/aix/CORE/perl.exp'
    cccdlflags=' ', lddlflags='-bhalt:4 -bM:SRE -bI:$(PERL_INC)/perl.exp -bE:$(BASEEXT).exp -bnoentry -lC -lc'


Characteristics of this binary (from libperl):
  Compile-time options: USE_LARGE_FILES
  Locally applied patches:
        IndigoPerl Build 804
  Built under aix
  Compiled at Feb  9 2003 13:22:48
  %ENV:
    PERL5LIB="/vobs/siebel/src/3rdparty/perl5.8/aix/lib/site_perl/5.8.0:/vobs/siebel/src/3rdparty/perl5.8/aix/lib/site_perl/5.8.0/aix/auto/DBI/"
    PERLHOME="/vobs/siebel/src/3rdparty/perl5.8/aix"
  @INC:
    /vobs/siebel/src/3rdparty/perl5.8/aix/lib/site_perl/5.8.0/aix
    /vobs/siebel/src/3rdparty/perl5.8/aix/lib/site_perl/5.8.0
    /vobs/siebel/src/3rdparty/perl5.8/aix/lib/site_perl/5.8.0/aix/auto/DBI/
    /vobs/siebel/src/3rdparty/perl5.8/aix/lib/5.8.0/aix
    /vobs/siebel/src/3rdparty/perl5.8/aix/lib/5.8.0
    /vobs/siebel/src/3rdparty/perl5.8/aix/lib/site_perl/5.8.0/aix
    /vobs/siebel/src/3rdparty/perl5.8/aix/lib/site_perl/5.8.0
    /opt/lib/perl5/site_perl
    .
3> What ODBC driver manager are you using?
[Chunmei]: UnixODBC 2.3.0


4> I think it could be helpful (if no one else has a better proposal) to start fresh and record the entire make output in a file
[Chunmei]: I did it, but I didn't get any error when run 'make':
    a) perl Makefile.PL
	Warning: LD_LIBRARY_PATH doesn't include /home/eng-sm/unixuser/claire/test/perl/unixodbc_install2.3.0_64/
	[Chunmei]: the warning is strange. Even I set this environment to include this directory, it still report such warning. Meanwhile, I think AIX didn't use this environment but LIBPATH.
	WARNING: NO_META is not a known parameter.
	b) make
	NO warning.
	c) make test
	The error 'can't load library...' occur.

5> Looks to me like libperl.a is missing from the requirements list of ODBC.so. As long you don't have statically linked the perl runtime, this could be an issue.
[Chunmei]: Following command is used to create ODBC.so:
LD_RUN_PATH="/home/eng-sm/unixuser/claire/test/perl/unixodbc_install2.3.0_64/lib" ld  -bhalt:4 -bM:SRE -bI:/vobs/vob_src_3rdparty/src/3rdparty/perl2exe/aix/perl2exe/perl5.8/lib/5.8.0/aix/CORE/perl.exp -bE:ODBC.exp -bnoentry -lC -lc ConvertUTF.o ODBC.o dbdimp.o unicode_helper.o  -o blib/arch/auto/DBD/ODBC/ODBC.so   -L/home/eng-sm/unixuser/claire/test/perl/unixodbc_install2.3.0_64/lib -lodbc

No error reports during the build and the ldd also is ok. 

6> Maybe it is only a question of dynamic loaded libraries not included in the search path. If I remember well there is a LD_LIBRARY_PATH variable you can add locations where to search libraries to be loaded when executing the program.
[Chunmei]: AIX uses LIBPATH instead of LD_LIBRARY_PATH to search libraries. The value of $LIBPATH is "/home/eng-sm/unixuser/claire/test/perl/unixodbc_install2.3.0_64//lib:/usr/lib:/lib:/opt/IBM/db2/V9.7/lib64" in my environment.

Thanks,
Chunmei Wu


-----Original Message-----
From: Jens Rehsack [mailto:[email protected]] 
Sent: 2010年5月10日 14:06
To: [email protected]
Subject: Re: make test: dlopen error :can't load library ODBC.so

On 05/10/10 02:06, Chunmei Wu wrote:
> Hi everyone,
>
> OS: AIX
> perl version: 5.0
>
> After installed DBD-ODBC-1.21, I run 'make test', but failed 'can't load library' error:
>                              t/20SqlServer...........ok 2/65install_driver(ODBC) failed: Can't load '/home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so' for module DBD::ODBC: dlopen: /home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so: can't load library /home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so103 /home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so at /vobs/siebel/src/3rdparty/perl5.8/aix/lib/5.8.0/aix/DynaLoader.pm line 229.
>                               at (eval 4) line 3
>                              Compilation failed in require at (eval 4) line 3.
>                              Perhaps a required shared library or dll isn't installed where expected
>                               at t/20SqlServer.t line 218
>
> But i can run ldd for this library:
>                              unixuser\@dsliaa05 #>  ldd /home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so
>                              /home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so needs:
>                                       /usr/lib/libc.a(shr_64.o)
>                                       /home/eng-sm/unixuser/claire/test/perl/unixodbc_install2.3.0_64/lib/libodbc.a(libodbc.so.1)
>                                       /unix
>                                       /usr/lib/libcrypt.a(shr_64.o)
>                                       /usr/lib/libpthread.a(shr_xpg5_64.o)
>                                       /usr/lib/libiconv.a(shr4_64.o)
>
> Can you help me? Thanks in advance!

Looks to me like libperl.a is missing from the requirements list of ODBC.so.
As long you don't have statically linked the perl runtime, this could be an 
issue.

But the error reported is;

> dlopen: /home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so: can't load library /home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so103

The file 
/home/eng-sm/unixuser/claire/test/perl/DBD-ODBC-1.21/blib/arch/auto/DBD/ODBC/ODBC.so103 
is required for some reason. 'make test' runs with the same permissions as 
'make' run, I assume.

Looks to me like something went wrong with your build. I think it could be 
helpful (if no one else has a better proposal) to start fresh and record the 
entire make output in a file:
$ perl Makefile.PL [flags ...] >log 2>&1
$ make >log 2>&1
$ make test >log 2>&1

If you add some flags to one of the lines, it might be good to echo the line 
first to the log and execute it then.

/Jens
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.