2012-03-02 2 views
4

저는 NetCDF C++ 라이브러리를 사용하고 있으며 NetCDF는 HDF-4 라이브러리를 사용 중입니다. 그러나 HDF-4 라이브러리가 잘못되었습니다. 나는 매우 짧은 내 LD_LIBRARY_PATH를 설정 한왜 내 Linux 응용 프로그램이 잘못된 .so 라이브러리를 사용하고 있습니까?

/apps1/intel/bin/icpc -gxx-name=/apps1/gcc-4.5.0/bin/g++ -shared -o lib/libMyCustom.so 
    -Llib -L/apps1/boost-1.48.0/lib -Wl,-rpath=/apps1/boost-1.48.0/lib 
    -L/apps1/gdal-1.8.0-jasper/lib -Wl,-rpath=/apps1/gdal-1.8.0-jasper/lib 
    -L/new_apps1/hdf4/lib -Wl,-rpath=/new_apps1/hdf4/lib -L/new_apps1/netcdf/lib 
    -Wl,-rpath=/new_apps1/netcdf/lib -lboost_system -lboost_serialization 
    -lboost_date_time -lboost_thread -lgdal -ldf -lmfhdf -lnetcdf_c++ 
    MyProj/obj/ProjUtility.o MyProj/obj/ProjMetadataException.o 
    MyProj/obj/ProjTimestampUtil.o 

:

여기 내 응용 프로그램이 연결되는 방법

LD_LIBRARY_PATH=/new_apps1/hdf4/lib:/new_apps1/hdf5/lib: 
    /apps1/intel/composerxe/lib/intel64:/apps1/gcc-4.5.0/lib64:/apps1/gcc-4.5.0/lib 

그리고 여기에 ldd -v 출력에서 ​​발췌 한 것입니다 :

libdf.so.0 => /new_apps1/hdf4/lib/libdf.so.0 (0x00002af5baabc000) 
    libmfhdf.so.0 => /new_apps1/hdf4/lib/libmfhdf.so.0 (0x00002af5bad61000) 
    libnetcdf_c++.so.5 => /new_apps1/netcdf/lib/libnetcdf_c++.so.5 (0x00002af5baf85000) 
    libhdf5.so.6 => /new_apps1/hdf5/lib/libhdf5.so.6 (0x00002af5bd1e7000) 
    libgif.so.4 => /usr/lib64/libgif.so.4 (0x0000003a6bc00000) 
    libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x0000003a71000000) 
    libnetcdf.so.6 => /new_apps1/netcdf/lib/libnetcdf.so.6 (0x00002af5bd682000) 
    libhdf5_hl.so.6 => /new_apps1/hdf5/lib/libhdf5_hl.so.6 (0x00002af5be272000) 

    /new_apps1/hdf4/lib/libdf.so.0: 
      libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6 
      libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6 
    /new_apps1/hdf4/lib/libmfhdf.so.0: 
      libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6 
    /new_apps1/netcdf/lib/libnetcdf_c++.so.5: 
      libgcc_s.so.1 (GCC_3.0) => /apps1/gcc-4.5.0/lib64/libgcc_s.so.1 
      libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6 
      libstdc++.so.6 (CXXABI_1.3) => /apps1/gcc-4.5.0/lib64/libstdc++.so.6 
      libstdc++.so.6 (GLIBCXX_3.4) => /apps1/gcc-4.5.0/lib64/libstdc++.so.6 
    /new_apps1/hdf5/lib/libhdf5.so.6: 
      libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6 
      libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6 
      libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6 
    /new_apps1/netcdf/lib/libnetcdf.so.6: 
      libm.so.6 (GLIBC_2.2.5) => /lib64/libm.so.6 
      libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6 
      libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6 
    /new_apps1/hdf5/lib/libhdf5_hl.so.6: 
      libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6 

지금까지 LD_LIBRARY_PATH, rpath 및 ldd의 모든 항목은 참조하려는 HDF를 가리키고 있음을 나타냅니다 (/ new _apps1/hdf4/lib/libmfhdf.so.0).

Invalid read of size 4 
    at 0x67CF765: NC_var_shape (in /apps1/hdf-4.2.6/lib/libmfhdf.so.0.0.0) 
    by 0x91327CA: nc_get_NC (v1hpg.c:1113) 
    by 0x91303C0: l3nc__open_mp (nc.c:1096) 
    by 0x915B279: nc3d__open_mp (dapdispatch3.c:336) 
    by 0x914A752: nc3d_open (ncdap3.c:94) 
    by 0x911F8A2: l4nc_open_file (nc4file.c:2338) 
    by 0x916A290: nc4d_open_file (ncdap4.c:122) 
    by 0x911CDDF: nc__open (nc4file.c:2407) 
    by 0x69E85F8: NcFile::NcFile(char const*, NcFile::FileMode, unsigned long*, unsigned long, NcFile::FileFormat) (netcdf.cpp:384) 
    by 0x710F0B8: getData(std::string const&) (ProjTimestampUtil.cc:593) 
    by 0x70E9BEA: (anonymous namespace)::parseOptions(int, char**) (ProjUtility.cc:190) 
    by 0x70EAAFB: main(int, char**) (ProjUtility.cc:243) 
    Address 0x1051 is not stack'd, malloc'd or (recently) free'd 


Process terminating with default action of signal 11 (SIGSEGV) 
    Access not within mapped region at address 0x1051 
    at 0x67CF765: NC_var_shape (in /apps1/hdf-4.2.6/lib/libmfhdf.so.0.0.0) 
    by 0x91327CA: nc_get_NC (v1hpg.c:1113) 
    by 0x91303C0: l3nc__open_mp (nc.c:1096) 
    by 0x915B279: nc3d__open_mp (dapdispatch3.c:336) 
    by 0x914A752: nc3d_open (ncdap3.c:94) 
    by 0x911F8A2: l4nc_open_file (nc4file.c:2338) 
    by 0x916A290: nc4d_open_file (ncdap4.c:122) 
    by 0x911CDDF: nc__open (nc4file.c:2407) 
    by 0x69E85F8: NcFile::NcFile(char const*, NcFile::FileMode, unsigned long*, unsigned long, NcFile::FileFormat) (netcdf.cpp:384) 
    by 0x710F0B8: getData(std::string const&) (ProjTimestampUtil.cc:593) 
    by 0x70E9BEA: (anonymous namespace)::parseOptions(int, char**) (ProjUtility.cc:190) 
    by 0x70EAAFB: main(int, char**) (ProjUtility.cc:243) 

: 나는 실행할 때, Valgrind의는 대신 내가에 연결을 시도하고있어 HDF-4 라이브러리의 (가 segfaulting 왜 아마 임) OLD HDF-4 도서관에서 죽어 가고 내게 말하고있다 동적으로 다른 라이브러리를 가져올 때 내 앱이 경로 정보를 얻는 곳은 어디입니까?

답변

4

나는 모든 방법 -rpath와 LD_LIBRARY_PATH 작업의 세부 사항과 우선 순위가 정확히 모르겠지만, 나는 몇 가지 유용한 환경 변수를 찾을 않았다

  • LD_DEBUG=all -이 ENV 변수 자세한 동적 켜지을 링커 디버깅. 이제 앱에서 ldd를 수행하면 모든 종속성이 종속성을 찾는 방법에 대한 세부 정보가 출력됩니다.
  • LD_DEBUG_OUTPUT=<filename_prefix> - LD_DEBUG와 함께 사용하여 디버깅 정보를 기록 할 출력 파일을 지정합니다. LD_DEBUG ENV 변수가 나를 /apps1/gdal-1.8.0-jasper/lib/libgdal.so.1가의 이전 (잘못된) 버전을 당기는 된 -rpath 옵션을 사용하여 컴파일 된 것을 추적하는 데 도움

내 도서관.

search path=/pathXYZ/lib/tls/x86_64:/pathXYZ/lib/tls:/pathXYZ/lib/x86_64: 
    /pathABC/jasper/lib:/pathABC/hdf5/lib/tls/x86_64:/pathABC/hdf5/lib/tls: 
    /pathABC/hdf5/lib/x86_64:/pathABC/hdf5/lib:/pathABC/netcdf/lib/tls/x86_64: 
    /pathABC/netcdf/lib/tls:/pathABC/netcdf/lib/x86_64:/pathABC/netcdf/lib 

      (RPATH from file /apps1/gdal-1.8.0-jasper/lib/libgdal.so.1) 

는 그래서 GDAL 라이브러리를 컴파일하는 방법의 RPATH가 내 LD_LIBRAR_PATH 주위에 최종 실행하게 될 듯 : 그것은이 도움이 디버그 출력을했다. 내가 제대로 libgdal 다시 내 실험실 팀을 얻을 수 있습니다 때까지, 나는 나에게 내가 원하는 "오른쪽"라이브러리 버전로드 도움이 ENV var에 발견 :

  • LD_PRELOAD=<path/to/libName.so> - 포인트를이 라이브러리의 위치를 ​​(또는 공백으로 구분 된 라이브러리 목록). 다른 모든 라이브러리보다 먼저로드해야합니다. ld.so man page을 참조하십시오.
+0

이것은 이런 종류의 문제에 대해 내가 보아본 가장 유용한 해결책이며, 결국 'RPATH' 문제와 비슷한 문제가 발생했습니다. 바이너리에'readelf'를 실행 해'RPATH'가 정의되어 있는지, 그것이 틀린 지 확인하십시오. 올바르지 않은 경우'.profile' /'.bashrc'가'PATH' 또는'LD_LIBRARY_PATH'를 예상치 못한 것으로 설정하고 있지 않은지 확인하십시오. – patrickvacek

관련 문제