2017-11-05 5 views
2

Rcppを使用するRパッケージを構築し、サードパーティの共有オブジェクト(libbarraopt.so)へのリンクを作成します。などの共有オブジェクトもそのディレクトリにあります。それはにリンクそれらの共有オブジェクトを見つけることができることを確実にするために、私は~/.Renvironに次の変数を置く:rpathとのダイナミックリンクはUbuntuで動作しません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 

のUbuntu 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が、ここでは効果的ではないようです。

Ubuntu 16.04を搭載したマシンでは、ldd src/barraopt.soはすべてのダイナミックリンクが解決されたことを示しています。 (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) 

これ:(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) 

しかし、同じソースと、Ubuntuの17.10下、ldd-Wl,-rpathをsecifiedされるにもかかわらずに対する共有オブジェクトlibbarraopt.soリンクが解決されていないことを示しますlibbarraopt.soだけが正しいパスにリンクされているがリンク先の共有オブジェクトが見つからないようです。

17.10で出荷されるツールチェーンで壊れたビルド構成に何が間違っているのでしょうか。 ldconfigなどのグローバル設定を使用してもこのような問題は解決しますが、一部の.soはOSが提供するバージョンと競合しているため依存しません。むしろ、グローバル設定に影響を与えることなく、ローカルに設定されたバージョンを使用したいと思います。

+0

さて、今週私は、今週、17.04の下で '-rpath'を使って新しいプロジェクトを立ち上げ、それが期待どおりに機能することを保証します...より小さい例では、ここにいる。 –

答えて

3

ここで、-Wl、-rpathは有効ではないようです。おそらく何が起こった

更新し、リンカが古いリンカがDT_RPATHを放出さDT_RUNPATHダイナミックタグを放出することです。 (以前のリンカーはGNU-ldで、新しいものはGoldである可能性もあります)

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

はい、ELATHには 'RPATH'ではなく' RUNPATH'が表示されます。私の場合は、RPATHが必要です。 –

+0

Ubuntu 16.04に同梱されている 'ld'のデフォルトの動作が、Ubuntu 17.10の動作と異なっているようです。 '/ usr/bin/ld'が指している両方の場所を見ると、どちらも' x86_64-linux-gnu-ld'を指しますが、バージョンは異なります。 1つは 'GNU-ld'で、もう1つは' Gold'かバージョンが壊れていますか? –

+0

@KunRen私は '17.10'の' 16.04'に簡単にアクセスできません。 'ld --version'を実行することができます。 GNU-ldは 'GNU ld(Ubuntu用GNU Binutils)...'のようになります。金は次のようになります: 'GNU gold(UbuntuのGNU Binutils ...)' –

関連する問題