Jump to content

pdo_parse_params error in pdo_odbc.so whenever PHP starts in Fedora 20


purkinje

Recommended Posts

Sorry about any formatting inconsistencies here. This question was originally posted on stackoverflow, but none of the suggestions there solved my issue so I thought I'd bring it up here. Some of the information may be extraneous, but was asked for on SO, so I thought it might be helpful. 
 
I'm getting this error when I try to start PHP via command line on Fedora 20:
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_odbc.so' - /usr/lib64/php/modules/pdo_odbc.so: undefined symbol: pdo_parse_params in Unknown on line 0
Here are the PHP packages I have installed:
php.x86_64                      5.5.7-1.fc20        @updates                    
    php-ZendFramework.noarch        1.12.3-3.fc20       @updates                    
    php-bcmath.x86_64               5.5.7-1.fc20        @updates                    
    php-cli.x86_64                  5.5.7-1.fc20        @updates                    
    php-common.x86_64               5.5.7-1.fc20        @updates                    
    php-devel.x86_64                5.5.7-1.fc20        @updates                    
    php-gd.x86_64                   5.5.7-1.fc20        @updates                    
    php-mcrypt.x86_64               5.5.7-1.fc20        @updates                    
    php-mssql.x86_64                5.5.7-1.fc20        @updates                    
    php-odbc.x86_64                 5.5.7-1.fc20        @updates                    
    php-pdo.x86_64                  5.5.7-1.fc20        @updates                    
    php-pear.noarch                 1:1.9.4-23.fc20     @fedora                     
    php-pecl-jsonc.x86_64           1.3.3-1.fc20        @updates                    
    php-pecl-jsonc-devel.x86_64     1.3.3-1.fc20        @updates                    
    php-process.x86_64              5.5.7-1.fc20        @updates                    
    php-xml.x86_64                  5.5.7-1.fc20        @updates
I have `extension=pdo_odbc.so` and `extension=oci8.so` as the only extensions defined in my `/etc/php.ini` file. There are also a lot of .ini files in the `/etc/php.d` directory that loads most of the other extensions. The following .so files are in the `/usr/lib64/php/modules` directory:
    -rwxr-xr-x. 1 root root   32560 Dec 10 23:51 bcmath.so
    -rwxr-xr-x. 1 root root   24696 Dec 10 23:51 bz2.so
    -rwxr-xr-x. 1 root root   33752 Dec 10 23:51 calendar.so
    -rwxr-xr-x. 1 root root   15568 Dec 10 23:51 ctype.so
    -rwxr-xr-x. 1 root root   86912 Dec 10 23:51 curl.so
    -rwxr-xr-x. 1 root root  180608 Dec 10 23:51 dom.so
    -rwxr-xr-x. 1 root root   65496 Dec 10 23:51 exif.so
    -rwxr-xr-x. 1 root root 2713328 Dec 10 23:51 fileinfo.so
    -rwxr-xr-x. 1 root root   53624 Dec 10 23:51 ftp.so
    -rwxr-xr-x. 1 root root  120904 Dec 10 23:51 gd.so
    -rwxr-xr-x. 1 root root   15640 Dec 10 23:51 gettext.so
    -rwxr-xr-x. 1 root root   45080 Dec 10 23:51 iconv.so
    -rwxr-xr-x. 1 root root   40840 Dec 12 09:13 json.so
    -rwxr-xr-x. 1 root root   45256 Dec 10 23:51 mcrypt.so
    -rwxr-xr-x. 1 root root   53816 Dec 10 23:51 mssql.so
    -rwxr-xr-x. 1 root root  560751 Jan 10 10:20 oci8.so
    -rwxr-xr-x. 1 root root   70312 Dec 10 23:51 odbc.so
    -rwxr-xr-x. 1 root root   25008 Dec 10 23:51 pdo_dblib.so
    -rwxr-xr-x. 1 root root   28856 Dec 10 23:51 pdo_odbc.so
    -rwxr-xr-x. 1 root root  116240 Dec 10 23:51 pdo.so
    -rwxr-xr-x. 1 root root   29168 Dec 10 23:51 pdo_sqlite.so
    -rwxr-xr-x. 1 root root  272000 Dec 10 23:51 phar.so
    -rwxr-xr-x. 1 root root   32880 Dec 10 23:51 posix.so
    -rwxr-xr-x. 1 root root   15624 Dec 10 23:51 shmop.so
    -rwxr-xr-x. 1 root root   54176 Dec 10 23:51 simplexml.so
    -rwxr-xr-x. 1 root root   91368 Dec 10 23:51 sockets.so
    -rwxr-xr-x. 1 root root   51336 Dec 10 23:51 sqlite3.so
    -rwxr-xr-x. 1 root root   19880 Dec 10 23:51 sysvmsg.so
    -rwxr-xr-x. 1 root root   11496 Dec 10 23:51 sysvsem.so
    -rwxr-xr-x. 1 root root   15720 Dec 10 23:51 sysvshm.so
    -rwxr-xr-x. 1 root root   19712 Dec 10 23:51 tokenizer.so
    -rwxr-xr-x. 1 root root   36720 Dec 10 23:51 wddx.so
    -rwxr-xr-x. 1 root root   32888 Dec 10 23:51 xmlreader.so
    -rwxr-xr-x. 1 root root   54072 Dec 10 23:51 xml.so
    -rwxr-xr-x. 1 root root   49152 Dec 10 23:51 xmlwriter.so
    -rwxr-xr-x. 1 root root   37104 Dec 10 23:51 xsl.so

The output of when I run phpinfo() can be found here.

 
Contents of `pdo_odbc.ini` at /etc/php.d:
; Enable pdo_odbc extension module
extension=pdo_odbc.so
Output of `readelf -Ws pdo_odbc.so`:
 
 Symbol table '.dynsym' contains 83 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
         0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
         1: 0000000000001ac0     0 SECTION LOCAL  DEFAULT    9 
         2: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND convert_to_long
         3: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND pdo_parse_params
         4: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_pdo_unregister_driver
         5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND free@GLIBC_2.2.5 (2)
         6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND strcasecmp@GLIBC_2.2.5 (2)
         7: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
         8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLParamData
         9: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND cfg_get_string
        10: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLRowCount
        11: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _estrdup
        12: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND strlen@GLIBC_2.2.5 (2)
        13: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLFreeHandle
        14: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLFetchScroll
        15: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __stack_chk_fail@GLIBC_2.4 (3)
        16: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _zval_dtor_func
        17: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLDriverConnect
        18: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLPutData
        19: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND zend_fetch_resource
        20: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND strchr@GLIBC_2.2.5 (2)
        21: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_info_print_table_row
        22: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _php_stream_stat
        23: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLGetDiagRec
        24: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLDescribeCol
        25: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _erealloc
        26: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_pdo_get_exception
        27: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND zend_hash_index_find
        28: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND zend_declare_class_constant_long
        29: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
        30: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLCloseCursor
        31: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLSetEnvAttr
        32: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_error_docref0
        33: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_info_print_table_end
        34: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _safe_malloc
        35: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memcpy@GLIBC_2.14 (4)
        36: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLConnect
        37: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND zend_throw_exception_ex
        38: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_file_le_stream
        39: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLDescribeParam
        40: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_info_print_table_header
        41: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_pdo_register_driver
        42: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLColAttribute
        43: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_pdo_get_dbh_ce
        44: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLPrepare
        45: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _ecalloc
        46: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLSetConnectAttr
        47: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __strcpy_chk@GLIBC_2.3.4 (5)
        48: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _convert_to_string
        49: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLExecute
        50: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _efree
        51: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLExecDirect
        52: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND zval_is_true
        53: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLSetCursorName
        54: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLDisconnect
        55: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
        56: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _php_stream_read
        57: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND add_next_index_string
        58: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _estrndup
        59: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLEndTran
        60: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _emalloc
        61: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLNumResultCols
        62: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLGetData
        63: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_file_le_pstream
        64: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _zval_copy_ctor_func
        65: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_registerTMCloneTable
        66: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLBindParameter
        67: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLGetCursorName
        68: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND add_next_index_long
        69: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLSetStmtAttr
        70: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLAllocHandle
        71: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND php_info_print_table_start
        72: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLBindCol
        73: 0000000000000000     0 FUNC    WEAK   DEFAULT  UND __cxa_finalize@GLIBC_2.2.5 (2)
        74: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND spprintf
        75: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND strstr@GLIBC_2.2.5 (2)
        76: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND SQLMoreResults
        77: 0000000000206438     0 NOTYPE  GLOBAL DEFAULT   23 _edata
        78: 0000000000206440     0 NOTYPE  GLOBAL DEFAULT   24 _end
        79: 0000000000002310     8 FUNC    GLOBAL DEFAULT   11 get_module
        80: 0000000000206438     0 NOTYPE  GLOBAL DEFAULT   24 __bss_start
        81: 0000000000001ac0     0 FUNC    GLOBAL DEFAULT    9 _init
        82: 00000000000045a4     0 FUNC    GLOBAL DEFAULT   12 _fini
Link to comment
Share on other sites

Alright, so the explanation of why:

 

php.ini gets loaded before anything in the php.d directory. That means your extension=pdo_odbc.so was executed before any other extensions could be loaded, however it's required that you load the PDO extension before you load any PDO drivers. So PHP bailed. It then started reading stuff from php.d, including the parts where it was told to load pdo.so and pdo_odbc.so; those were in the right load order so it all worked and you still got your extension in the end.

 

So the moral of the story is that if you have a php.d (or other similar directory) then that's where extension loading should be done - not the php.ini.

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.