programing

mariadb C 커넥터를 링크할 때 참조가 정의되지 않음

kingscode 2022. 12. 28. 22:08
반응형

mariadb C 커넥터를 링크할 때 참조가 정의되지 않음

mariadb C 커넥터를 자체 코드로 작동시키기 위해 (너무 많은) 많은 시간을 소비했습니다.MySQL C 커넥터는 정상적으로 동작했지만 mariadb로 이행하기로 했습니다.

마지막으로 최소한의 코드를 사용하여 문제가 코드 또는 환경에 있는지 확인하기로 결정했는데 동일한 오류가 발생했습니다.코드는 SO:C에서 MariaDB를 사용하는 질문에서 나온 것입니다.

#include <my_global.h>
#include <mysql.h>

int main(int argc, char **argv)
{  
  MYSQL *con = mysql_init(NULL);

  if (con == NULL) 
  {
      fprintf(stderr, "%s\n", mysql_error(con));
      exit(1);
  }

  if (mysql_real_connect(con, "localhost", "root", "root_pswd", 
          NULL, 0, NULL, 0) == NULL) 
  {
      fprintf(stderr, "%s\n", mysql_error(con));
      mysql_close(con);
      exit(1);
  }  

  if (mysql_query(con, "CREATE DATABASE testdb")) 
  {
      fprintf(stderr, "%s\n", mysql_error(con));
      mysql_close(con);
      exit(1);
  }

  mysql_close(con);
  exit(0);
}

컴파일을 하려고 했는데

gcc -v -o mysql-test mysql-test.c $(mariadb_config --libs)

로 확장되었다.

gcc -v -o mysql-test mysql-test.c $(mariadb_config --libs)

제가 받은 출력은

Using built-in specs.
Target: x86_64-suse-linux
Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.3 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.3 --enable-linux-futex --without-system-libunwind --with-cpu=generic --build=x86_64-suse-linux
Thread model: posix
gcc version 4.3.4 [gcc-4_3-branch revision 152973] (SUSE Linux)
COLLECT_GCC_OPTIONS='-v' '-o' 'mysql-test' '-L/usr/local/lib/mariadb' '-mtune=generic'
 /usr/lib64/gcc/x86_64-suse-linux/4.3/cc1 -quiet -v mysql-test.c -quiet -dumpbase mysql-test.c -mtune=generic -auxbase mysql-test -version -o /tmp/ccISncmQ.s
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib64/gcc/x86_64-suse-linux/4.3/include
 /usr/lib64/gcc/x86_64-suse-linux/4.3/include-fixed
 /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/include
 /usr/include
End of search list.
GNU C (SUSE Linux) version 4.3.4 [gcc-4_3-branch revision 152973] (x86_64-suse-linux)
        compiled by GNU C version 4.3.4 [gcc-4_3-branch revision 152973], GMP version 4.2.3, MPFR version 2.3.2.
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 91a878d77972b76d647d592fefc786fc
COLLECT_GCC_OPTIONS='-v' '-o' 'mysql-test' '-L/usr/local/lib/mariadb' '-mtune=generic'
 /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/as -V -Qy -o /tmp/ccD2nseu.o /tmp/ccISncmQ.s
GNU assembler version 2.20.0 (x86_64-suse-linux) using BFD version (GNU Binutils; SUSE Linux Enterprise 11) 2.20.0.20100122-0.7.9
COMPILER_PATH=/usr/lib64/gcc/x86_64-suse-linux/4.3/:/usr/lib64/gcc/x86_64-suse-linux/4.3/:/usr/lib64/gcc/x86_64-suse-linux/:/usr/lib64/gcc/x86_64-suse-linux/4.3/:/usr/lib64/gcc/x86_64-suse-linux/:/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/
LIBRARY_PATH=/usr/lib64/gcc/x86_64-suse-linux/4.3/:/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/lib/:/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'mysql-test' '-L/usr/local/lib/mariadb' '-mtune=generic'
 /usr/lib64/gcc/x86_64-suse-linux/4.3/collect2 --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o mysql-test /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/crt1.o /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/crti.o /usr/lib64/gcc/x86_64-suse-linux/4.3/crtbegin.o -L/usr/local/lib/mariadb -L/usr/lib64/gcc/x86_64-suse-linux/4.3 -L/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.3/../../.. /tmp/ccD2nseu.o -lmariadb -lssl -lnsl -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib64/gcc/x86_64-suse-linux/4.3/crtend.o /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/crtn.o
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `SSL_get_error@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `SSL_get_peer_certificate@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `SSL_CTX_load_verify_locations@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `SSL_set_ex_data@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `X509_STORE_CTX_get_error_depth@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `SSL_get_ex_data@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `SSL_write@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `SSL_clear@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `CRYPTO_THREADID_set_numeric@OPENSSL_1.0.0'
/usr/local/lib/mariadb/libmariadb.so: undefined reference to `SSL_COMP_get_compression_methods@OPENSSL_1.0.0'
...

LibOpenSSL 1.0.0이 설치되어 라이브러리 경로에 라이브러리가 있습니다.libopensl-devel도 설치해야 했습니다.

$LD_LIBRARY_PATH에는 /lib64/libssl.so.1.0.0에 대한 libssl.so 링크가 있습니다.실행했을 경우

nm -g /usr/lib64/libssl.so

나는 이해한다

nm: /usr/lib64/libssl.so: no symbols

libopensl 0.9.8 도 인스톨 됩니다.

# rpm -qa | grep libopenssl
libopenssl0_9_8-0.9.8h-30.27.11
libopenssl-devel-1.0.0c-17.1
libopenssl0_9_8-32bit-0.9.8h-30.27.11
libopenssl1_0_0-1.0.0c-17.1

단서는?감사합니다!

갱신일 :ldd 출력

# ldd /usr/local/lib/mariadb/libmariadb.so
/usr/local/lib/mariadb/libmariadb.so: /lib64/libcrypto.so.1.0.0: no version information available (required by /usr/local/lib/mariadb/libmariadb.so)
/usr/local/lib/mariadb/libmariadb.so: /lib64/libssl.so.1.0.0: no version information available (required by /usr/local/lib/mariadb/libmariadb.so)
/usr/local/lib/mariadb/libmariadb.so: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /usr/local/lib/mariadb/libmariadb.so)
        linux-vdso.so.1 =>  (0x00007fff2d90f000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f08bc078000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f08bbe73000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f08bbc1d000)
        libssl.so.1.0.0 => /lib64/libssl.so.1.0.0 (0x00007f08bb9c1000)
        libcrypto.so.1.0.0 => /lib64/libcrypto.so.1.0.0 (0x00007f08bb60f000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f08bb2b1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f08bc521000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f08bb099000)

glicbc_2.14는 찾을 수 없지만 libc.so.6이면 충분할 것 같습니다.OpenSuse 11.4 저장소 glibc 버전은 glibc-2.11.3-12.15.1.x86_64.rpm입니다.

업데이트 2:프로그램의 심볼을 표시에 성공했습니다.

objdump -tT /usr/lib64/libssl.so

그리고 그 기호들은 거기에 있다.

업데이트 3 및 솔루션(회피책):

주요 문제는 libmariadb.so에는 glibc 2.14가 필요한데 openuse에서는 11.4 glibc 버전이 2.11이라는 것입니다.opensuse 12.1에서 glibc 2.14를 설치하면 시스템을 대폭 업그레이드 할 수 없었습니다.

2.0 시리즈의 커넥터도 사용해 보았습니다.또한 유사한 메시지로 인해 실패했습니다.

다음으로 1.0 시리즈를 찾아봤습니다.이전에 커넥터에 이름이 붙여졌다고 읽었습니다.libmariadbclientlibmariadbclient 패키지를 설치한 것을 기억하고 링커 플래그를 -lmariadbclient로 변경했습니다.성공했어!

그러나 링커는 libmariadbclient 패키지의 라이브러리를 사용하지 않고 커넥터에 포함된 정적 라이브러리(libmariadbclient.a)를 사용했습니다.그래서 정적으로 연결하면 커넥터가 작동했습니다.

MariaDB Connector/C를 사용하려면 OpenSSL 1.0.1 이상이 필요합니다.

「커넥터/C를 소스로부터 빌드하기 위한 전제 조건」을 참조해 주세요.

또한 OpenSSL 버전 < 1.0.2는 eoled로 취약할 수 있습니다.

언급URL : https://stackoverflow.com/questions/29102253/undefined-references-when-linking-mariadb-c-connector

반응형