크로스 컴파일 시 GCC 링커 검색 경로

크로스 컴파일 시 GCC 링커 검색 경로

특정 컴파일러 버전에서 컴파일하기 위해 Linux 시스템에 다양한 도구 체인 디렉터리가 있습니다. 링커(툴체인 디렉터리에 있음)가 툴체인(/toolchain/lib/...)의 라이브러리 파일 대신 기본 컴퓨터(예: /lib)에서 라이브러리 파일을 선택하는 문제가 있습니다. 이로 인해 다음과 같은 다양한 링커 오류가 발생할 수 있습니다.

/opt/foo/cross_x86_64_v9b/lib/gcc/x86_64-linux/9.2.0/../../../../bin/x86_64-linux-ld: /lib/x86_64-linux-gnu/libxmlrpc_client.so.3: undefined reference to `curl_easy_getinfo@CURL_OPENSSL_4'

/opt/foo/cross_x86_64_v9b/lib64/libxmlrpc_client.so.3(툴체인 버전) 대신 /lib/x86_64-linux-gnu/libxmlrpc_client.so.3(내 Ubuntu의 기본 파일)에 연결되기 때문에 링크가 실패합니다.

내가 아는 한 검색 경로는 다음과 같습니다.

/opt/foo/cross_x86_64_v9b/bin/x86_64-linux-ld --verbose | grep SEARCH_DIR
SEARCH_DIR("/opt/foo/cross_x86_64_v9b/x86_64-linux/lib64"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/lib64"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/lib"); SEARCH_DIR("/opt/foo/cross_x86_64_v9b/x86_64-linux/lib");

/lib/x86_64-linux-gnu에서 libxml... 파일을 제거하면 연결이 성공하므로 위의 SEARCH_DIR 이전에 해당 경로가 검색됩니다. 링크된 모든 시스템 라이브러리는 /opt/foo/cross_x86_64_v9b 아래에 있어야 합니다.

내 환경에는 LD_PATH 및 LD_LIBRARY_PATH가 정의되어 있지 않습니다. 링커가 /opt/foo/cross_x86_64_v9b/lib64/ 전에 /lib를 검색하는 이유는 무엇입니까? 이 문제를 어떻게 해결할 수 있습니까?

답변1

고려해야 할 두 가지 간단한 아이디어:

  1. 구성 중에 지정하는 lib 경로가 이 경로 목록 binutils에 추가됩니다 . SEARCH_DIR순차적으로 어디에 배치되어 있는지는 정확히 알 수 없으나, 구성 및 설치 시 옵션을 포함시켜 놓으면 쉽게 확인할 수 있습니다.

    --with-lib-path=/opt/foo/cross_x86_64_v9b/lib64
    
  2. libc.so및 에서 검색 경로를 수동으로 편집할 수 있습니다 libm.so. 이로 인해 또 다른 오류가 발생할 수 있으니 주의하세요...

    cp -uv /opt/foo/cross_x86_64_v9b/lib/libc.so{,.orig}
    cp -uv /opt/foo/cross_x86_64_v9b/lib/libm.so{,.orig}
    sed -e 's@/path1@/path2@g' /opt/foo/cross_x86_64_v9b/lib/libc.so.orig > /opt/foo/cross_x86_64_v9b/lib/libc.so
    sed -e 's@/path1@/path2@g' /opt/foo/cross_x86_64_v9b/lib/libm.so.orig > /opt/foo/cross_x86_64_v9b/lib/libm.so
    diff /opt/foo/cross_x86_64_v9b/lib/libc.so{,.orig}
    diff /opt/foo/cross_x86_64_v9b/lib/libm.so{,.orig}
    

관련 정보