2012-11-11 2 views
5

J'essaye de construire et installer mon propre gcc 4.7.2 dans/usr/local pour l'utiliser à la place du gcc 4.4.6 dans/usr. (Ceci est sur CentOS 6.3.)Comment construire et installer gcc avec rpath intégré?

gcc rend les exécutables et les bibliothèques dynamiques qui lient dynamiquement à ses propres bibliothèques dynamiques, par ex. libstdC++. Comment puis-je construire et installer gcc pour que les binaires générés obtiennent automatiquement une option linker -rpath (-rpath/usr/local/lib64) qui lie les bibliothèques dynamiques dans/usr/local/lib64 à celles de/usr/lib64 ou/lib64? Si cela fonctionne correctement, après avoir construit un exécutable avec le gcc sans spécifier "-Wl, -rpath =/usr/local/lib64", quand je ldd l'exécutable, il devrait afficher/usr/local/lib64/libstdC++. so.6 au lieu de /usr/lib64/libstdc++.so.6. De même pour le libgcc_s.so.1.

J'ai essayé différentes approches, y compris en spécifiant LDFLAGS_FOR_TARGET = -Wl, -rpath =/usr/local/lib64, -rpath =/usr/local/lib sur la ligne de commande 'configure', mais rien n'a fonctionné.

Répondre

2

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 
+0

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'. –

Questions connexes