2012-11-11 12 views
5

Próbuję zbudować i zainstalować własny gcc 4.7.2 w/usr/local do użycia zamiast gcc 4.4.6 w/usr. (To jest na CentOS 6.3.)Jak zbudować i zainstalować gcc z wbudowaną ścieżką?

gcc tworzy pliki wykonywalne i biblioteki dynamiczne, które dynamicznie łączą się z własnymi bibliotekami dynamicznymi, np. libstdC++. so. Jak zbudować i zainstalować gcc, aby wygenerowane pliki binarne automatycznie otrzymały opcję linker -rpath (-rpath/usr/local/lib64), która powoduje, że dynamiczne biblioteki w/usr/local/lib64 są połączone zamiast tych w/usr/lib64 lub/lib64?

Jeśli działa poprawnie, po zbudowaniu pliku wykonywalnego z gcc bez określania "-Wl, -rpath =/usr/local/lib64", podczas instalacji pliku wykonywalnego powinien on pokazywać/usr/local/lib64/libstdC++. so.6 zamiast /usr/lib64/libstdc++.so.6. Podobnie dla libgcc_s.so.1.

Próbowałem różnych podejść, w tym określanie LDFLAGS_FOR_TARGET = -Wl, -rpath =/usr/local/lib64, -rpath =/usr/local/lib na wierszu polecenia "configure", ale nic nie działało.

Odpowiedz

2

Jeśli nie chcą eksportować ścieżki istnieje alternatywne rozwiązanie:

z toolchain w PATH:

gcc -dumpspecs > specsfile 

edit specsfile iw sekcji link dodać przykład -rpath:

*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 

w tym momencie możesz sprawdzić, czy współpracuje z:

g++ -specs=specsfile test.cpp 
readelf -d a.out |grep RPATH 

jeśli to działa można je na stałe (nie trzeba przechodzić -specs spędzaj)

strace -fF -o /tmp/g++.log g++ test.cpp 
grep specs /tmp/g++.log 

grep powinny pokazać ścieżki gdzie gcc szukać pliku domyślnym specs.

W specs pliki są wystarczająco elastyczne, aby umożliwić łączenie warunkowego w zależności od zmiennych, na przykład:

{!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}} 

należy stosować różne i wielu ścieżek w zależności od mabi (wypróbowane, ale) %R powinna być ścieżka sysroot można zmienić z wymaganą pełną ścieżką.

Jest też --with-specs= opcja gcc configure ostatecznie zostać wykorzystane w czasie kompilacji , nie dla mnie jasne, ale jak korzystać z sekcji link (praca na nim).

--with-specs="%{shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}%{!shared:-Wl,-rpath -Wl,$(DESTDIR)/lib}" 

działać, użyłem zarówno shared i nie !shared tylko do testów, prawdopodobnie jakiś mądrzejszy warunek powinien być używany, należy pamiętać, że nie jest zgłaszana z -dumpspecs.

Czytając jakiś gwint gcc listy miałem wrażenie specs nie są lubiane przez wszystkich (ale jeśli się nie mylę 4,9 dodać inną opcję --with-extra-specs) zamiast preferowany sposób zrobić takie dostosowania wydaje się być configure.host, ale skończyłem i nie zaglądałem w to, baw się dobrze!:-)

zobacz także: gcc faq rpath

aktualizacja powyżej

Nie wiem, czy można ustawić wstępnie zdefiniowane rpath, prawdopodobnie, jeśli można byłoby w łączniku ld z binutils nie w gcc/g++, ale dlaczego miałbyś to zrobić?

Wystarczy wyeksportować LD_LIBRARY_PATH w czasie rzeczywistym i LD_RUN_PATH w czasie kompilacji

export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH 
ldd a.out 

ldd powinien pokazać ścieżki wyeksportowane.

Cytując komunikat podany podczas wspólna biblioteka jest zbudowany z libtool:

Jeśli kiedykolwiek zdarzy się chce połączyć przeciwko zainstalowanych bibliotek w danym katalogu, LIBDIR, musisz albo użycie libtool i określić pełna ścieżka do biblioteki lub użyj `„flagę podczas łączenia i zrobić co najmniej jedną z następujących czynności:

  • dodać LIBDIR do LD_LIBRARY_PATH `” -LLIBDIR zmiennej środowiskowej podczas wykonywania
  • dodać LIBDIR do `LD_RUN_PATH 'envi ronment zmienna podczas łączenie
  • użyć `-Wl - rpath -Wl, LIBDIR 'Łącznik flag
  • mieć administrator systemu dodać LIBDIR do` pliku /etc/ld.so.conf'

See dowolna dokumentacja systemu operacyjnego dotycząca bibliotek współużytkowanych dla dodatkowych informacji, takich jak strony podręcznika ld (1) i ld.so (8).

kompletności Makefile używałem do testowania rzeczy, wszystkich opcji konfiguracji, zmiennych środowiskowych (patrz LDFLAGS startowych) Próbowałem nie działa, --enable-rpath włączone.

korzystanie z mkdir ~/gcc skopiować Makefile poniżej w ~/gcc następnie cd ~/gcc && make build-gcc

Ogłoszenie użyte opcje są tylko dla tego testu, nie należy używać jako odniesienia.

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

Nie wiem, czy to nie było jeszcze w 2014 roku, ale teraz to chyba lepszy pomysł, aby użyć '* Link: + -rpath =/usr/local/lib64' niż faktycznie zmodyfikować podstawowa linia ciągu '* link'. –