beyondlinuxfromscratch:installedpackages:about_libtool_archive_.la_files

Beyond Linux® From Scratch (systemd Edition) - Version 12.1
Chapter 2. Important Information
이전 위로 / 처음으로 다음
BLFS Systemd Units Libraries: Static or shared?

LFS와 BLFS에서 많은 패키지는 내부적으로 제공된 libtool 사본을 사용하여 다양한 Unix 플랫폼에서 빌드합니다. 여기에는 Linux뿐만 아니라 AIX, Solaris, IRIX, HP-UX, Cygwin과 같은 플랫폼이 포함됩니다. 이 도구의 기원은 꽤 오래되었습니다. 최신 Linux 시스템보다 기능이 덜 발전된 시스템에서 라이브러리를 관리하기 위한 것이었습니다.

Linux 시스템에서는 일반적으로 libtool 특정 파일이 필요하지 않습니다. 일반적으로 라이브러리는 링크 단계에서 빌드 프로세스에서 지정됩니다. Linux 시스템에서는 실행 파일 및 동적 라이브러리에 ELF(실행 가능 및 링크 가능 형식)를 사용하므로 작업을 완료하는 데 필요한 정보가 파일에 포함되어 있습니다. 링커와 프로그램 로더는 모두 적절한 파일을 쿼리하여 프로그램을 적절하게 링크하거나 실행할 수 있습니다.

정적 라이브러리는 LFS와 BLFS에서 거의 사용되지 않습니다. 그리고 오늘날 대부분의 패키지는 정적 라이브러리에 대한 링크에 필요한 정보를 libtool에 의존하는 대신 .pc 파일에 저장합니다. pkg-config –static –libs 명령은 링커가 정적 라이브러리에 대해 링킹할 수 있는 충분한 플래그를 출력하므로 libtool의 마법 없이도 링킹할 수 있습니다.

문제는 libtool이 일반적으로 libtool 아카이브라고 하는 패키지 라이브러리용 텍스트 파일을 하나 이상 생성한다는 것입니다. 이 작은 파일은 확장자가 “.la”이며 라이브러리 또는 pkg-config 파일에 포함된 것과 유사한 정보를 포함합니다. libtool을 사용하는 패키지를 빌드할 때 프로세스는 자동으로 이러한 파일을 찾습니다. 간혹 .la 파일에 빌드 중에 사용되지만 설치되지 않은 정적 라이브러리의 이름이나 경로가 포함될 수 있는데, 이 경우 .la 파일이 시스템에 존재하지 않는 것을 참조하므로 빌드 프로세스가 중단됩니다. 마찬가지로 패키지가 업데이트되어 더 이상 .la 파일을 사용하지 않는 경우 이전 .la 파일로 인해 빌드 프로세스가 중단될 수 있습니다.

해결책은 .la 파일을 제거하는 것입니다. 하지만 문제가 있습니다. ImageMagick-7.1.1-28과 같은 일부 패키지는 실행 중에 필요에 따라 라이브러리를 로드하고 런타임에 종속성을 해결하기 위해 libtool 함수인 lt_dlopen을 사용합니다. 이 경우 .la 파일은 그대로 유지됩니다.

아래 스크립트는 불필요한 .la 파일을 모두 제거하고 기본적으로 일반 라이브러리 경로가 아닌 /var/local/la-files 디렉터리에 저장합니다. 또한 모든 pkg-config 파일(.pc)에서 .la 파일에 대한 임베디드 참조를 검색하여 애플리케이션 또는 라이브러리를 빌드할 때 필요한 일반 라이브러리 참조로 수정합니다. 필요에 따라 실행하여 문제를 일으킬 수 있는 디렉터리를 정리할 수 있습니다.

cat > /usr/sbin/remove-la-files.sh << "EOF"
#!/bin/bash

# /usr/sbin/remove-la-files.sh
# Written for Beyond Linux From Scratch
# by Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Make sure we are running with root privs
if test "${EUID}" -ne 0; then
    echo "Error: $(basename ${0}) must be run as the root user! Exiting..."
    exit 1
fi

# Make sure PKG_CONFIG_PATH is set if discarded by sudo
source /etc/profile

OLD_LA_DIR=/var/local/la-files

mkdir -p $OLD_LA_DIR

# Only search directories in /opt, but not symlinks to directories
OPTDIRS=$(find /opt -mindepth 1 -maxdepth 1 -type d)

# Move any found .la files to a directory out of the way
find /usr/lib $OPTDIRS -name "*.la" ! -path "/usr/lib/ImageMagick*" \
  -exec mv -fv {} $OLD_LA_DIR \;
###############

# Fix any .pc files that may have .la references

STD_PC_PATH='/usr/lib/pkgconfig
             /usr/share/pkgconfig
             /usr/local/lib/pkgconfig
             /usr/local/share/pkgconfig'

# For each directory that can have .pc files
for d in $(echo $PKG_CONFIG_PATH | tr : ' ') $STD_PC_PATH; do

  # For each pc file
  for pc in $d/*.pc ; do
    if [ $pc == "$d/*.pc" ]; then continue; fi

    # Check each word in a line with a .la reference
    for word in $(grep '\.la' $pc); do
      if $(echo $word | grep -q '.la$' ); then
        mkdir -p $d/la-backup
        cp -fv  $pc $d/la-backup

        basename=$(basename $word )
        libref=$(echo $basename|sed -e 's/^lib/-l/' -e 's/\.la$//')

        # Fix the .pc file
        sed -i "s:$word:$libref:" $pc
      fi
    done
  done
done

EOF

chmod +x /usr/sbin/remove-la-files.sh

  • beyondlinuxfromscratch/installedpackages/about_libtool_archive_.la_files.txt
  • 마지막으로 수정됨: 2024/06/10 15:23
  • 저자 baecy