[ZBX-10760] Dependency from UnixODBC for Zabbix utilities and Zabbix agent Created: 2016 May 06  Updated: 2017 May 30  Resolved: 2016 May 24

Status: Closed
Project: ZABBIX BUGS AND ISSUES
Component/s: Agent (G)
Affects Version/s: None
Fix Version/s: 3.0.4rc1, 3.2.0alpha1

Type: Incident report Priority: Trivial
Reporter: Alexey Pustovalov Assignee: Unassigned
Resolution: Fixed Votes: 0
Labels: agent, get, odbc, sender
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

CentOS 7


Attachments: File ZBX-10760.diff    
Issue Links:
Duplicate
is duplicated by ZBX-10826 zabbix-agent RedHat RPM incorrect Uni... Closed

 Description   

If Zabbix sources compiled with --with-unixodbc flag, there is added dependency from libodbc.so to zabbix_get, zabbix_agentd applications:

./configure --enable-agent --with-unixodbc --enable-server --with-mysql
[root@localhost 3.0.2]# ldd ./src/zabbix_get/zabbix_get 
	linux-vdso.so.1 =>  (0x00007ffdfcb44000)
	libodbc.so.2 => /lib64/libodbc.so.2 (0x00007f76b36e3000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f76b33e1000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f76b31dc000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f76b2fc2000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f76b2c01000)
	libltdl.so.7 => /lib64/libltdl.so.7 (0x00007f76b29f6000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f76b27da000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f76b3955000)
[root@localhost 3.0.2]# ldd ./src/zabbix_agent/zabbix_agentd
	linux-vdso.so.1 =>  (0x00007ffd949dc000)
	libodbc.so.2 => /lib64/libodbc.so.2 (0x00007fbce3c9a000)
	libm.so.6 => /lib64/libm.so.6 (0x00007fbce3998000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007fbce3793000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbce3579000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fbce31b8000)
	libltdl.so.7 => /lib64/libltdl.so.7 (0x00007fbce2fad000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbce2d91000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fbce3f0c000)
[root@localhost 3.0.2]# ldd ./src/zabbix_sender/zabbix_sender
	linux-vdso.so.1 =>  (0x00007ffe67d2c000)
	libodbc.so.2 => /lib64/libodbc.so.2 (0x00007f9526040000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f9525d3e000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f9525b39000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f952591f000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f952555e000)
	libltdl.so.7 => /lib64/libltdl.so.7 (0x00007f9525353000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9525137000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f95262b2000)


 Comments   
Comment by Oleksii Zagorskyi [ 2016 May 06 ]

Compilation options are identical for both versions, all features enabled:

# /zab/zabbix-2.4/src/zabbix_get/zabbix_get -V
Zabbix get v2.4.8 (revision 59629) (20 April 2016)
Compilation time: Apr 27 2016 11:47:35

# ldd /zab/zabbix-2.4/src/zabbix_get/zabbix_get
        linux-vdso.so.1 (0x00007fff025f8000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0e9cd36000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0e9cb32000)
        libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f0e9c91b000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e9c570000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0e9d037000)
# /zab/zabbix-3.0.0/src/zabbix_get/zabbix_get -V
zabbix_get (Zabbix) 3.0.0
Revision 58460 15 February 2016, compilation time: May  6 2016 15:42:16

Copyright (C) 2016 Zabbix SIA
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it according to
the license. There is NO WARRANTY, to the extent permitted by law.

# ldd /zab/zabbix-3.0.0/src/zabbix_get/zabbix_get
        linux-vdso.so.1 (0x00007ffea2db8000)
        libodbc.so.2 => /usr/lib/x86_64-linux-gnu/libodbc.so.2 (0x00007ff5442ee000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff543fed000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff543de9000)
        libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007ff543bd2000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff543827000)
        libltdl.so.7 => /usr/lib/x86_64-linux-gnu/libltdl.so.7 (0x00007ff54361d000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff543400000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff544556000)
Comment by Oleksii Zagorskyi [ 2016 May 06 ]

I can CONFIRM it.

Comment by Glebs Ivanovskis (Inactive) [ 2016 May 06 ]

One can see -lodbc appearing in compiler options twice for agent and three times for server:

gcc -DZABBIX_DAEMON -DSYSCONFDIR="\"/usr/local/etc\"" -DLIBDIR="\"/usr/local/lib\"" -g -O2   -rdynamic    -o zabbix_agentd zabbix_agentd-active.o zabbix_agentd-stats.o zabbix_agentd-cpustat.o zabbix_agentd-diskdevices.o zabbix_agentd-vmstats.o zabbix_agentd-logfiles.o zabbix_agentd-zbxconf.o zabbix_agentd-listener.o zabbix_agentd-procstat.o zabbix_agentd-zabbix_agentd.o ../../src/libs/zbxsysinfo/libzbxagentsysinfo.a ../../src/libs/zbxsysinfo/linux/libspecsysinfo.a ../../src/libs/zbxsysinfo/linux/libspechostnamesysinfo.a ../../src/libs/zbxsysinfo/agent/libagentsysinfo.a ../../src/libs/zbxsysinfo/common/libcommonsysinfo.a ../../src/libs/zbxsysinfo/simple/libsimplesysinfo.a ../../src/libs/zbxlog/libzbxlog.a ../../src/libs/zbxregexp/libzbxregexp.a ../../src/libs/zbxalgo/libzbxalgo.a ../../src/libs/zbxsys/libzbxsys.a ../../src/libs/zbxnix/libzbxnix.a ../../src/libs/zbxcomms/libzbxcomms.a ../../src/libs/zbxconf/libzbxconf.a ../../src/libs/zbxcommon/libzbxcommon.a ../../src/libs/zbxcrypto/libzbxcrypto.a ../../src/libs/zbxjson/libzbxjson.a ../../src/libs/zbxexec/libzbxexec.a ../../src/libs/zbxmodules/libzbxmodules.a ../../src/libs/zbxself/libzbxself.a     -lodbc -lm -ldl  -lresolv -lodbc 
...
gcc -DZABBIX_DAEMON -DSYSCONFDIR="\"/usr/local/etc\"" -DDATADIR="\"/usr/local/share\"" -DLIBDIR="\"/usr/local/lib\"" -I../../src/libs/zbxdbcache -g -O2  -L/usr/lib           -rdynamic    -o zabbix_server zabbix_server-actions.o zabbix_server-operations.o zabbix_server-events.o zabbix_server-scripts.o zabbix_server-server.o alerter/libzbxalerter.a dbsyncer/libzbxdbsyncer.a dbconfig/libzbxdbconfig.a discoverer/libzbxdiscoverer.a pinger/libzbxpinger.a poller/libzbxpoller.a housekeeper/libzbxhousekeeper.a timer/libzbxtimer.a trapper/libzbxtrapper.a snmptrapper/libzbxsnmptrapper.a httppoller/libzbxhttppoller.a watchdog/libzbxwatchdog.a escalator/libzbxescalator.a proxypoller/libzbxproxypoller.a selfmon/libzbxselfmon.a vmware/libzbxvmware.a ../../src/libs/zbxsysinfo/libzbxserversysinfo.a ../../src/libs/zbxsysinfo/common/libcommonsysinfo.a ../../src/libs/zbxsysinfo/simple/libsimplesysinfo.a ../../src/libs/zbxlog/libzbxlog.a ../../src/libs/zbxserver/libzbxserver.a ../../src/libs/zbxdbcache/libzbxdbcache.a ../../src/libs/zbxmemory/libzbxmemory.a ../../src/libs/zbxregexp/libzbxregexp.a ../../src/libs/zbxalgo/libzbxalgo.a ../../src/libs/zbxnix/libzbxnix.a ../../src/libs/zbxsys/libzbxsys.a ../../src/libs/zbxconf/libzbxconf.a ../../src/libs/zbxmedia/libzbxmedia.a ../../src/libs/zbxcommon/libzbxcommon.a ../../src/libs/zbxcrypto/libzbxcrypto.a ../../src/libs/zbxcomms/libzbxcomms.a ../../src/libs/zbxcommshigh/libzbxcommshigh.a ../../src/libs/zbxjson/libzbxjson.a ../../src/libs/zbxexec/libzbxexec.a ../../src/libs/zbxself/libzbxself.a ../../src/libs/zbxicmpping/libzbxicmpping.a ../../src/libs/zbxdbupgrade/libzbxdbupgrade.a ../../src/libs/zbxdbhigh/libzbxdbhigh.a ../../src/libs/zbxdb/libzbxdb.a ../../src/libs/zbxmodules/libzbxmodules.a -lpq    -lodbc        -lodbc -lm -ldl  -lresolv -lodbc 

Seems like we do not restore original LDFLAGS and LIBS in m4/libunixodbc.m4:

	if test "x$unixodbc_error" = "x"; then
		_save_unixodbc_cflags="${CFLAGS}"
		_save_unixodbc_ldflags="${LDFLAGS}"
		_save_unixodbc_libs="${LIBS}"
		CFLAGS="${CFLAGS} ${UNIXODBC_CFLAGS}"
		LDFLAGS="${LDFLAGS} ${UNIXODBC_LDFLAGS}"
		LIBS="${LIBS} ${UNIXODBC_LIBS}"

		AC_CHECK_LIB(odbc, SQLAllocHandle, ,[unixodbc_error="unixODBC library not found"])

		if test "x$unixodbc_error" = "x"; then
			AC_DEFINE(HAVE_UNIXODBC,1,[Define to 1 if unixUNIXODBC Driver Manager should be used.])
		fi
	fi

Probably broken by ZBX-8658.

Comment by Glebs Ivanovskis (Inactive) [ 2016 May 10 ]

Attached patch which seemingly fixes the issue.

Before:

$ CC=clang ./configure -q --enable-agent --enable-proxy --enable-server --with-postgresql --with-unixodbc


Configuration:

  Detected OS:           linux-gnu
  Install path:          /usr/local
  Compilation arch:      linux

  Compiler:              clang
  Compiler flags:         -g -O2 

  Library-specific flags:
    database:                 -I/usr/include/postgresql 

  Enable server:         yes
  Server details:
    With database:         PostgreSQL
    WEB Monitoring:        no
    Native Jabber:         no
    SNMP:                  no
    IPMI:                  no
    SSH:                   no
    TLS:                   no
    ODBC:                  yes
    Linker flags:              -L/usr/lib           -rdynamic   
    Libraries:                 -lpq    -lodbc       -lodbc -lm -ldl  -lresolv -lodbc 

  Enable proxy:          yes
  Proxy details:
    With database:         PostgreSQL
    WEB Monitoring:        no
    SNMP:                  no
    IPMI:                  no
    SSH:                   no
    TLS:                   no
    ODBC:                  yes
    Linker flags:              -L/usr/lib          -rdynamic   
    Libraries:                 -lpq   -lodbc       -lodbc -lm -ldl  -lresolv -lodbc 

  Enable agent:          yes
  Agent details:
    TLS:                   no
    Linker flags:              -rdynamic   
    Libraries:                 -lodbc -lm -ldl  -lresolv -lodbc 

  Enable Java gateway:   no

  LDAP support:          no
  IPv6 support:          no

***********************************************************
*            Now run 'make install'                       *
*                                                         *
*            Thank you for using Zabbix!                  *
*              <http://www.zabbix.com>                    *
***********************************************************

$ make clean
...
$ make
...
$ ldd src/zabbix_agent/zabbix_agentd
	linux-vdso.so.1 =>  (0x00007ffece93e000)
	libodbc.so.1 => /usr/lib/x86_64-linux-gnu/libodbc.so.1 (0x00007f0a8305f000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0a82d59000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0a82b54000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f0a82939000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0a82574000)
	libltdl.so.7 => /usr/lib/x86_64-linux-gnu/libltdl.so.7 (0x00007f0a82369000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0a8214b000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f0a832ef000)

After:

$ svn patch ~/ZBX-10760.diff 
U         m4/libunixodbc.m4
$ ./bootstrap.sh 
$ CC=clang ./configure -q --enable-agent --enable-proxy --enable-server --with-postgresql --with-unixodbc


Configuration:

  Detected OS:           linux-gnu
  Install path:          /usr/local
  Compilation arch:      linux

  Compiler:              clang
  Compiler flags:         -g -O2

  Library-specific flags:
    database:                 -I/usr/include/postgresql 

  Enable server:         yes
  Server details:
    With database:         PostgreSQL
    WEB Monitoring:        no
    Native Jabber:         no
    SNMP:                  no
    IPMI:                  no
    SSH:                   no
    TLS:                   no
    ODBC:                  yes
    Linker flags:              -L/usr/lib           -rdynamic  
    Libraries:                 -lpq    -lodbc       -lm -ldl  -lresolv 

  Enable proxy:          yes
  Proxy details:
    With database:         PostgreSQL
    WEB Monitoring:        no
    SNMP:                  no
    IPMI:                  no
    SSH:                   no
    TLS:                   no
    ODBC:                  yes
    Linker flags:              -L/usr/lib          -rdynamic  
    Libraries:                 -lpq   -lodbc       -lm -ldl  -lresolv 

  Enable agent:          yes
  Agent details:
    TLS:                   no
    Linker flags:              -rdynamic  
    Libraries:                 -lm -ldl  -lresolv 

  Enable Java gateway:   no

  LDAP support:          no
  IPv6 support:          no

***********************************************************
*            Now run 'make install'                       *
*                                                         *
*            Thank you for using Zabbix!                  *
*              <http://www.zabbix.com>                    *
***********************************************************

$ make clean
...
$ make
...
$ ldd src/zabbix_agent/zabbix_agentd
	linux-vdso.so.1 =>  (0x00007ffe4a172000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f122e27d000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f122e079000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f122de5d000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f122da98000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f122e5ac000)

P.S. gcc did not add dependency from libodbc even when -lodbc flag was present... or I made something wrong... Anyway, you can see that -lodbc disappears from ./configure output.

Comment by Glebs Ivanovskis (Inactive) [ 2016 May 10 ]

Fix for version 3.0 is available in development branch svn://svn.zabbix.com/branches/dev/ZBX-10760 revision 59987.

Comment by Andris Zeila [ 2016 May 13 ]

Successfully tested

Comment by Aleksandrs Saveljevs [ 2016 May 16 ]

(1) Unrelated to this task, but while branches are frozen, decided to provide a bit more proper implementation for dc_string_buffer_realloc() and dc_local_get_history_slot() functions in r60114 and r60115. Please verify.

glebs.ivanovskis As I understand, the main idea is not to waste zbx_realloc() calls. Please have a look at r60118.

asaveljevs Yes, your understanding is correct. Commit in r60118 had an overly long line, so r60119 combines the two approaches.

glebs.ivanovskis Code in r60119 performs division every time reallocation is needed, although ZBX_STRING_REALLOC_STEP should be chosen so that in majority of situations one addition would be sufficient. I went back to iterative method in r60238.

asaveljevs Wonderful! CLOSED.

Comment by Glebs Ivanovskis (Inactive) [ 2016 May 23 ]

Fixed in pre-3.0.4rc1 r60260, pre-3.1.0 (trunk) r60261.

Generated at Fri Apr 19 04:44:06 EEST 2024 using Jira 9.12.4#9120004-sha1:625303b708afdb767e17cb2838290c41888e9ff0.