ARM 장치에서 NTPv4(크로스 컴파일)를 실행할 때 재배치 오류

ARM 장치에서 NTPv4(크로스 컴파일)를 실행할 때 재배치 오류

ARM 장치에서 ntp-keygen(또는 ntpd)을 실행할 때 나타나는 오류 메시지는 다음과 같습니다.

./ntp-keygen: relocation error: ./ntp-keygen: symbol DSA_generate_parameters_ex, version OPENSSL_1_1_0 not defined in file libcrypto.so.1.1 with link time reference

OpenSSL을 구성, 빌드 및 설치하는 스크립트는 다음과 같습니다.

#!/bin/bash

# Build dependencies if any.
depends()
{
   cd $buildDir
   if [ "x${PERL}" = "x" ]; then
      export PERL=`which perl`
   fi

   return $?
}

# Configure software package.
configure()
{
   depends
   cd $packageDir

   # Available ciphers:
   #    DES, AES, CAMELLIA, MD2, MDC2, MD4, MD5, HMAC, SHA, RIPEMD, WHIRLPOOL,
   #    RC4, RC5, RC2, IDEA, SEED, BF(blowfish), CAST, RSA, DSA, ECDSA, ECDH
   # We use:
   #    DES, AES, MD4, MD5, HMAC, SHA, RSA, ECDSA, ECDH
   ./Configure shared threads --prefix=$PWD/install-arm linux-armv4

   return $?
}


# Build the software package.
compile()
{ 
   local mmx_machine_type=`echo $MMX_MACHINE_TYPE | tr '[:upper:]' '[:lower:]'`

   depends
   cd $packageDir

   export CFLAGS="$CFLAGS -DCONFIG_MACHINE_${MMX_MACHINE_TYPE}"
   configure

   if [ "$?" -ne "0" ]; then return 1; fi

   make CC=$CC AR=$AR NM=$NM RANLIB=$RANLIB
   if [ "$?" -ne "0" ]; then return 1; fi

   make CC=$CC AR=$AR NM=$NM RANLIB=$RANLIB install
   if [ "$?" -ne "0" ]; then return 1; fi

   return 0
}


# Clean-up.
clean()
{
   depends
   cd $packageDir

   rm -rf install-arm/*
   rm -rf install-i386/*
   make clean
}


# Install to rootfs the necessary pieces (e.g. directories, links...)
install()
{
   targetPath=${buildDir}/.tmp.rootfs/rootfs
   
   local openssl="bin/openssl"
   local libssl="lib/libssl.so.1.1"
   local libcrypto="lib/libcrypto.so.1.1"

   cd ${packageDir}/install-arm

   if [ -f ${openssl} -a -f ${libssl} -a -f ${libcrypto} ]
   then
      cp ${openssl}   ${targetPath}/sbin/
      cp ${libssl}    ${targetPath}/lib/
      cp ${libcrypto} ${targetPath}/lib/
   else
      printf "  $package not built.\n"
   fi

   return 0
}

ntp 패키지의 경우 OpenSSL에 대한 유일한 참조는 구성 옵션에 있습니다. 다음은 전체 ntp 패키지 구성입니다.

#!/bin/sh

# Configure software package.
configure()
{
  cd $packageDir

  ./bootstrap
  ./configure --host=arm-linux --with-yielding-select=yes  --with-crypto=openssl \
    --with-openssl-incdir=$OPENSSL_DIR/install-arm/include/ \
        --with-openssl-libdir=$OPENSSL_DIR/install-arm/lib/ \

  return $?
}


# Build the software package.
compile()
{ 
  cd $packageDir

  # make PROJECT_NAME=$project
  make
  if [ "$?" -ne "0" ]; then return 1; fi

  return 0
}


# Clean-up.
clean()
{
  cd $packageDir
  make clean
}


# Install to rootfs the necessary pieces (e.g. directories, links...)
install()
{
  cd $packageDir

  sourcePath=.
  targetPath=$buildDir/.tmp.rootfs/rootfs

  if [[ -f $sourcePath/ntpclient ]]; then
     cp $sourcePath/$package $targetPath/sbin/
  else
     printf "  $package not built.\n"
     return 1
  fi

  return 0
}

답변1

수신한 오류 메시지에 따르면 ntp-keygen 명령이 OpenSSL 라이브러리에서 DSA_generate_parameters_ex라는 함수를 사용하려고 시도하는 것으로 보이지만 이 함수는 설치한 라이브러리 버전에 정의되어 있지 않습니다. 이는 이 기능이 포함되지 않은 이전 버전의 OpenSSL을 사용하고 있거나 라이브러리가 ntp-keygen에 연결되는 방식에 문제가 있기 때문일 수 있습니다.

이 오류를 해결하려면 DSA_generate_parameters_ex 함수가 포함된 최신 버전의 OpenSSL로 업데이트하거나 OpenSSL 라이브러리 및 ntp-keygen을 다시 빌드하여 올바르게 연결되었는지 확인할 수 있습니다. ldd 명령을 사용하여 ntp-keygen 바이너리의 종속성을 확인하고 올바른 버전의 OpenSSL 라이브러리에 연결되어 있는지 확인할 수도 있습니다.

관련 정보