^ Beyond Linux(r) From Scratch (systemd Edition) - Version 12.1 ^^^ ^ Chapter 2. Important Information ^^^ |[[.:BLFS Systemd Units|이전]] | [[.:index|위로]] / [[:start|처음으로]] | [[.:Libraries Static or shared|다음]]| |BLFS Systemd Units | Libraries: Static or shared?| ---- ===== Libtool 아카이브(.la) 파일 ===== ==== 확장자가 .la인 파일 ==== 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 # 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