Si vous ne souhaitez pas exporter des chemins, il y a une solution alternative:
avec votre toolchain dans le PATH
:
gcc -dumpspecs > specsfile
modifier specsfile
et dans la section link
ajoutez votre -rpath
exemple:
À ce stade, vous pouvez tester si cela fonctionne avec:
*link:
%{!static:--eh-frame-hdr} -m %(link_emulation) %{shared:-shared} %{!shared: %{!static: %{rdynamic:-export-dynamic} -dynamic-linker %(dynamic_linker)} %{static:-static}} -rpath /usr/local/lib64
g++ -specs=specsfile test.cpp
readelf -d a.out |grep RPATH
si ça marche, vous pouvez le rendre permanent (pas besoin de passer -specs
chaque fois)
strace -fF -o /tmp/g++.log g++ test.cpp
grep specs /tmp/g++.log
le grep doit montrer les chemins où gcc
recherchez le fichier par défaut specs
.
suffisamment specs fichiers sont flexibles pour permettre la liaison conditionnelle en fonction des variables, par exemple:
{!static: %{mabi=n32:-rpath-link %R/lib32:%R/usr/lib32} %{mabi=64:-rpath-link %R/lib64:%R/usr/lib64} %{mabi=32:-rpath-link %R/lib:%R/usr/lib}}
doivent utiliser des chemins différents et multiples en fonction de MABI (non testé, encore), %R
doit être le chemin sysroot
, peut être changé avec le chemin complet nécessaire.
Il y a aussi une option --with-specs=
gcc configure éventuellement être utilisé à la construction du temps , pas clair pour moi encore comment utiliser avec la section link
(travaille).
--with-specs="%{shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}%{!shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}"
travail, j'utilisé à la fois shared
et non seulement pour !shared
test, probablement une condition plus intelligent doit être utilisé, notez qu'il ne soit pas rapporté avec -dumpspecs
.
lecture à travers un fil de la liste de diffusion gcc j'avais l'impression specs
ne sont pas aimé par tout le monde (mais si je ne me trompe pas 4.9 ajouter une autre option --with-extra-specs
) de manière plutôt préféré faire ces personnalisations semble être configure.host
, mais j'ai fini et ne pas regarder dedans, amusez-vous!:-)
voir aussi: gcc faq rpath
mise à jour ci-dessus
Je ne sais pas si vous pouvez définir un rpath
prédéfini, probablement si vous pouvez seriez dans l'éditeur de liens ld
de binutils
pas dans gcc/g++
, mais pourquoi le feriez-vous?
Exportez LD_LIBRARY_PATH
à l'exécution et à LD_RUN_PATH
moment de la construction
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
ldd a.out
ldd
devrait montrer les chemins que vous avez exportés.
Pour citer un message donné quand une bibliothèque partagée est construite avec libtool:
Si jamais vous voulez créer un lien avec les bibliothèques installées dans un répertoire donné, LIBDIR, vous devez utiliser libtool et spécifiez le chemin complet de la bibliothèque, ou utilisez le « drapeau pendant la liaison et faire au moins un des éléments suivants:
- ajouter LIBDIR la` LD_LIBRARY_PATH »` -LLIBDIR variable d'environnement lors de l'exécution
- ajouter LIBDIR à la `LD_RUN_PATH 'envi ronnement variable pendant la liaison
- utiliser le `-Wl, - rpath -Wl, LIBDIR 'éditeur de liens drapeau
- à votre administrateur système d'ajouter LIBDIR à` /etc/ld.so.conf
Voir toute documentation du système d'exploitation sur les bibliothèques partagées pour plus d'informations, telles que les pages de manuel ld (1) et ld.so (8).
pour être complet le Makefile
j'ai utilisé pour tester la chose, toutes les options de configuration, les variables d'environnement (voir ldflags de démarrage) J'ai essayé ne fonctionne pas, --enable-rpath
inclus.
utilisation avec mkdir ~/gcc
copier le Makefile
ci-dessous dans ~/gcc
puis cd ~/gcc && make build-gcc
Avis les options utilisées sont uniquement pour ce cas de test, ne pas utiliser comme référence.
FETCH = aria2c --file-allocation=none -c -d dl
NICE = nice -n 19
PARALLEL = -j4
DESTDIR = $(HOME)/gcc/install
SRCDIR = $(HOME)/gcc/src
all:
# if more downloads are added just remove {dl,src}/*-my-stamp not the .bak
# the .bak should avoid to rebuild targets because of timestamp
touch_stamp = if [ -f [email protected] ]; then \
touch -r [email protected] [email protected]; \
else \
touch [email protected] [email protected]; \
fi
dl/dl-my-stamp:
$(FETCH) https://ftp.gnu.org/gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2
$(FETCH) http://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.bz2
$(FETCH) ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
$(FETCH) https://ftp.gnu.org/gnu/mpfr/mpfr-2.4.2.tar.bz2
$(FETCH) --check-certificate=false http://www.mirrorservice.org/sites/sourceware.org/pub/binutils/snapshots/binutils-2.24.51.tar.bz2 \
ftp://sourceware.org/pub/binutils/snapshots/binutils-2.24.51.tar.bz2
$(touch_stamp)
untar_dep = src/untar-my-stamp
src/untar-my-stamp: dl/dl-my-stamp
mkdir -p src
tar -C src -xjf dl/gcc-4.7.2.tar.bz2
tar -C src -xjf dl/gmp-4.3.2.tar.bz2
tar -C src -xzf dl/mpc-0.8.1.tar.gz
tar -C src -xjf dl/mpfr-2.4.2.tar.bz2
tar -C src -xjf dl/binutils-2.24.51.tar.bz2
$(touch_stamp)
define configure-rule
$(1)_install = $(DESTDIR)/$(1)-install-my-stamp
$(1)_builddir = $$($(1)_dir)/build
$(DESTDIR)/$(1)-install-my-stamp: $$($(1)_deps)
mkdir -p $$($(1)_builddir)
cd $$($(1)_builddir) && \
$$($(1)_env) ../configure --cache-file=$(SRCDIR)/$(1)-config.cache \
$$($(1)_configure)
$(NICE) make -C $$($(1)_builddir) $$($(1)_make_target) $(PARALLEL)
ifneq ($$($(1)_post_make),)
$$($(1)_post_make)
endif
touch [email protected]
.PHONY: build-$(1) clean-$(1)
build-$(1): $$($(1)_install)
clean-$(1):
-rm -fr $$($(1)_builddir)
endef
gmp_dir = src/gmp-4.3.2
gmp_env = CONFIG_SITE=$(SRCDIR)/config.site
gmp_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static --enable-cxx
gmp_deps = $(untar_dep)
gmp_make_target = install
$(eval $(call configure-rule,gmp))
mpfr_dir = src/mpfr-2.4.2
mpfr_env = CONFIG_SITE=$(SRCDIR)/config.site
mpfr_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static \
--with-gmp=$(DESTDIR)
mpfr_deps = $(untar_dep) $(gmp_install)
mpfr_make_target = install
$(eval $(call configure-rule,mpfr))
mpc_dir = src/mpc-0.8.1
mpc_env = CONFIG_SITE=$(SRCDIR)/config.site
mpc_configure = --prefix=$(DESTDIR) \
--disable-shared --enable-static \
--with-gmp=$(DESTDIR) --with-mpfr=$(DESTDIR)
mpc_deps = $(untar_dep) $(gmp_install) $(mpfr_install)
mpc_make_target = install
$(eval $(call configure-rule,mpc))
gcc_dir = src/gcc-4.7.2
gcc_env = CONFIG_SITE=$(SRCDIR)/config.site \
CFLAGS="-I/usr/include/i386-linux-gnu" \
CXXFLAGS="-I/usr/include/i386-linux-gnu"
gcc_configure = --prefix=$(DESTDIR) \
--libdir=$(DESTDIR)/lib \
--with-local-prefix=$(DESTDIR) \
--with-gmp=$(DESTDIR) --with-mpfr=$(DESTDIR) \
--with-mpc=$(DESTDIR) \
--disable-bootstrap \
--enable-languages=c,c++ \
--disable-libgomp --disable-multilib \
--disable-libmudflap --disable-libssp \
--disable-libquadmath \
--enable-rpath \
MAKEINFO=missing
gcc_deps = $(untar_dep) $(gmp_install) $(mpfr_install) $(mpc_install)
gcc_make_target =
gcc_post_make = make -C $(gcc_builddir) install
$(eval $(call configure-rule,gcc))
binutils_dir = src/binutils-2.24.51
#binutils_env = LDFLAGS=-Wl,-rpath\ $(DESTDIR)/lib
binutils_env = CONFIG_SITE=$(SRCDIR)/config.site \
CFLAGS="-I/usr/include/i386-linux-gnu" \
BOOT_LDFLAGS="-rpath-link=$(DESTDIR)/lib -rpath=$(DESTDIR)/lib"
binutils_configure = --prefix=$(DESTDIR) \
--libdir=$(DESTDIR)/lib \
--with-gmp=$(DESTDIR) \
--enable-rpath
binutils_deps = $(untar_dep) $(gmp_install)
#binutils_make_target = install
binutils_post_make = make -C $(binutils_builddir) install
$(eval $(call configure-rule,binutils))
.PHONY: env
env:
@echo export PATH=$(DESTDIR)/bin:\$$PATH
@echo export LIBRARY_PATH=/usr/lib/i386-linux-gnu
Je ne sais pas si cela n'existait pas encore en 2014, mais pour l'instant, il est probablement une meilleure idée d'utiliser '* lien: + -rpath =/usr/local/lib64' que de modifier réellement la ligne de chaîne de spécification principale '* link'. –