2017-11-05 9 views
2

Rcpp를 사용하는 R 패키지를 만들고 타사 공유 객체 (libbarraopt.so) (다른 디렉토리에있는 liboptsrvr.so과 같은 링크)를 사용하는 R 패키지를 만듭니다. 에 연결하는 공유 객체를 찾을 수 있는지 확인하기 위해, 내가 ~/.Renviron에 다음과 같은 변수를 넣어 :우분투에서 작동하지 않는 rpath와의 동적 링크 17.10

BARRA_OPS_HOME=${HOME}/bin/BarraOptimizer8.5 

을 패키지에서, 나는 src/Makevars 다음 생성 :

BARRA_LIB=$(BARRA_OPS_HOME)/lib/intel64 
BARRA_INCLUDE=$(BARRA_OPS_HOME)/include 
PKG_CXXFLAGS=-I$(BARRA_INCLUDE) 
PKG_CFLAGS=-I$(BARRA_INCLUDE) 
PKG_LIBS=-L$(BARRA_LIB) -Wl,-R,$(BARRA_LIB) -lbarraopt 

우분투 16.04에서 , 나는 문제없이 패키지를 성공적으로 빌드,로드 및 사용할 수 있습니다. 그러나 OS가 17.10로 업그레이드 할 때 나는 정확히 같은 패키지를 테스트 할 때, 패키지가 만들어 질 수 있지만 말,로드 할 수 없습니다 :

g++ -std=gnu++11 -I/usr/share/R/include -DNDEBUG -I"/home/renkun/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include" -I/home/renkun/bin/BarraOptimizer8.5/include -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c RcppExports.cpp -o RcppExports.o 
** libs 
g++ -std=gnu++11 -I/usr/share/R/include -DNDEBUG -I"/home/renkun/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include" -I/home/renkun/bin/BarraOptimizer8.5/include -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c barraopt.cpp -o barraopt.o 
g++ -std=gnu++11 -shared -L/usr/lib/R/lib -Wl,-Bsymbolic-functions -Wl,-z,relro -o barraopt.so RcppExports.o barraopt.o -L/home/renkun/bin/BarraOptimizer8.5/lib/intel64 -Wl,-R,/home/renkun/bin/BarraOptimizer8.5/lib/intel64 -lbarraopt -L/usr/lib/R/lib -lR 
installing to /tmp/Rtmpvbb6Io/devtools_install_42a342a07f84/barraopt/libs 
* DONE (barraopt) 
Error in dyn.load(dllfile) : 
    unable to load shared object '/home/renkun/Workspaces/barraopt/src/barraopt.so': 
    liboptsrvr.so: cannot open shared object file: No such file or directory 
Calls: suppressPackageStartupMessages ... <Anonymous> -> load_all -> load_dll -> library.dynam2 -> dyn.load 
Execution halted 

Exited with status 1. 

-Wl,-rpath 여기에 효과적이지 않을 것 같다.

우분투 16.04가 설치된 컴퓨터에서 ldd src/barraopt.so은 모든 동적 연결이 해결 된 것으로 나타냅니다. (BARRA_OPS_HOME = /home/ken/bin/BarraOptimizer8.5는)

linux-vdso.so.1 => (0x00007ffc89a16000) 
libbarraopt.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libbarraopt.so (0x00007f85dae49000) 
libimf.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libimf.so (0x00007f85da97f000) 
libR.so => /usr/lib/libR.so (0x00007f85da346000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f85d9fc4000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f85d9dae000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f85d99e3000) 
liboptsrvr.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/liboptsrvr.so (0x00007f85d7b10000) 
libopsproto.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libopsproto.so (0x00007f85d77a1000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f85d7497000) 
libintlc.so.5 => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libintlc.so.5 (0x00007f85d7249000) 
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f85d6fe8000) 
libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f85d6da1000) 
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f85d6b31000) 
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f85d690f000) 
libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f85d66fe000) 
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f85d64e4000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f85d62dc000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f85d60d7000) 
libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f85d5eb5000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f85d5c98000) 
/lib64/ld-linux-x86-64.so.2 (0x000055fb75088000) 
libifcore.so.5 => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libifcore.so.5 (0x00007f85d5961000) 
libifport.so.5 => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libifport.so.5 (0x00007f85d5732000) 
libsvml.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libsvml.so (0x00007f85d4e6d000) 
libmosek64.so.7.0 => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libmosek64.so.7.0 (0x00007f85d3c63000) 
libiomp5.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libiomp5.so (0x00007f85d396b000) 
libprotobuf.so.6 => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libprotobuf.so.6 (0x00007f85d3668000) 
libbridge_common.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libbridge_common.so (0x00007f85d3417000) 
libsharc_xmlxproto.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libsharc_xmlxproto.so (0x00007f85d31a4000) 
libboost_thread.so.1.49.0 => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libboost_thread.so.1.49.0 (0x00007f85d2f8a000) 
libopenblas.so.0 => /usr/lib/libopenblas.so.0 (0x00007f85d0ef5000) 
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f85d0ccc000) 
libxerces-c-3.1.so => /home/ken/bin/BarraOptimizer8.5/lib/intel64/libxerces-c-3.1.so (0x00007f85d07c4000) 
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f85d0499000) 
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f85d027f000) 
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f85d0040000) 

그러나 동일한 소스, 우분투 17.10에서, ldd은 비록 -Wl,-rpath 해결되지 않습니다에 대한 객체를 공유 libbarraopt.so 링크가 secified 것을 보여줍니다 (BARRA_OPS_HOME = /home/renkun/bin/BarraOptimizer8.5)

linux-vdso.so.1 => (0x00007ffe067f5000) 
libbarraopt.so => /home/renkun/bin/BarraOptimizer8.5/lib/intel64/libbarraopt.so (0x00007f3dc5f0c000) 
libR.so => /usr/lib/libR.so (0x00007f3dc58e4000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f3dc555e000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f3dc5208000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f3dc4ff1000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3dc4c11000) 
liboptsrvr.so => not found 
libopsproto.so => not found 
libblas.so.3 => /usr/lib/x86_64-linux-gnu/libblas.so.3 (0x00007f3dc49b6000) 
libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f3dc4770000) 
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3dc44fe000) 
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f3dc42d8000) 
libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007f3dc40c8000) 
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f3dc3eab000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f3dc3ca3000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f3dc3a9f000) 
libgomp.so.1 => /usr/lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f3dc3870000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3dc3651000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f3dc6526000) 
libopenblas.so.0 => /usr/lib/x86_64-linux-gnu/libopenblas.so.0 (0x00007f3dc13ab000) 
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f3dc1182000) 
libgfortran.so.4 => /usr/lib/x86_64-linux-gnu/libgfortran.so.4 (0x00007f3dc0da3000) 
libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f3dc0b63000) 

그것을 libbarraopt.so이 올바른 경로와 연결되어 있지만 링크 된 공유 객체가 누락 된 것처럼 보입니다.

17.10으로 제공되는 툴체인에서 깨지는 빌드 구성에 무엇이 잘못 될지 궁금합니다. ldconfig과 같은 전역 설정을 사용하여 이러한 문제를 해결할 수 있지만, 일부는 .so OS가 제공하는 버전과 충돌하기 때문에 선호하지 않습니다. 차라리 글로벌 구성에 영향을 미치지 않고 로컬로 구성된 버전을 사용하고 싶습니다.

+0

이제 막 집에 돌아 왔지만, 이번 주에 17.04에서'-rpath'를 사용하여 새 프로젝트를 시작 했으므로 예상대로 작동했음을 알려드립니다 ... 최소한의 예제만으로도 장애물을 줄일 수 있습니다 너 여기있어. –

답변

3

여기서 -Wl, -rpath는 유효하지 않은 것으로 보입니다. 가능성이 무슨 일

업데이트 된 링커 이전 링커가 DT_RPATH을 방출 DT_RUNPATH 동적 태그를 방출한다는 것이다. (이전 링커가 GNU-ld 였고 새로운 것이 GNU 일 수도 있습니다.)

DT_RUNPATH은보다 정확하고 바이너리 자체의 검색 경로에는 적합하지만 종속 라이브러리에는 영향을주지 않습니다. .

DT_RPATH에는 환경 변수가 LD_LIBRARY_PATH 인 디렉토리와 유사한 전역 효과가 있습니다.

readelf -d a.out | grep 'R.*PATH'으로이를 확인할 수 있습니다.

당신이 RPATHRUNPATH 차이를 볼 수 할, 실제로 골드를 사용하는 경우, 당신은 -Wl,--disable-new-dtags와 "오래된"행동을 (이 중 하나를 링커에 대한 작업을해야하므로 GNU ld--disable-new-dtags가, 최근에 추가 한) 강제 할 수 .

+0

예, 'RPATH'대신 'RUNPATH'가 ELF에 나타납니다. 제 경우에는 RPATH가 필요합니다. –

+0

우분투 16.04와 함께 제공되는'ld'의 기본 동작이 우분투 17.10과 다른 것으로 보입니다. 나는'/ usr/bin/ld'가 가리키는 두 위치를 모두 보았습니다, 그들은 둘 다'x86_64-linux-gnu-ld'를 가리 켰지 만 다른 버전을 가리 킵니다. 하나는'GNU-ld'이고 다른 하나는'Gold'인가 아니면 그냥 버전이 깨지는가? –

+0

@KunRen 나는'17.10' 중'16.04'에 쉽게 접근 할 수 없습니다. 'ld --version'을 실행할 수 있습니다. GNU-ld는'GNU ld (우분투 용 GNU Binutils) ... '와 같이 보일 것입니다. 금은 다음과 같이 보일 것입니다 :'GNU gold (우분투 용 GNU Binutils ...)' –