2012-11-11 10 views
5

मैं जीसीसी 4.4.6/usr में स्थानांतरित करने के लिए/usr/local में अपने स्वयं के जीसीसी 4.7.2 को बनाने और स्थापित करने की कोशिश कर रहा हूं। (यह CentOS 6.3 पर है।)अंतर्निहित आरपीएथ के साथ जीसीसी बनाने और स्थापित करने के लिए कैसे?

जीसीसी निष्पादन योग्य और गतिशील पुस्तकालय बनाता है जो गतिशील रूप से अपने गतिशील पुस्तकालयों से लिंक करता है, उदा। libstdC++। इसलिए। मैं जीसीसी का निर्माण और स्थापित कैसे करूं ताकि उत्पन्न बाइनरी स्वचालित रूप से एक लिंकर -प्रैथ विकल्प (-rpath/usr/local/lib64) प्राप्त करें जो/usr/local/lib64 में गतिशील पुस्तकालयों को/usr/lib64 या/lib64?

अगर यह ठीक से काम करता है, तो मैं "-Wl, -rpath =/usr/local/lib64" निर्दिष्ट किए बिना जीसीसी के साथ निष्पादन योग्य बनाने के बाद, जब मैं निष्पादन योग्य को चुनता हूं, तो इसे/usr/local/lib64/libstdC++। so.6/usr/lib64/libstdc++.so.6 के बजाय। इसी तरह libgcc_s.so.1 के लिए।

मैंने 'कॉन्फ़िगरेशन' कमांड लाइन पर LDFLAGS_FOR_TARGET = -Wl, -rpath =/usr/local/lib64, -rpath =/usr/local/lib निर्दिष्ट करने सहित विभिन्न दृष्टिकोणों का प्रयास किया है, लेकिन कुछ भी काम नहीं किया है।

उत्तर

2

आप रास्तों निर्यात करने के लिए वहाँ कोई वैकल्पिक समाधान है नहीं करना चाहते हैं:

अपने toolchain के साथ PATH में:

gcc -dumpspecs > specsfile 

संपादित specsfile और अनुभाग link में अपने -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 

इस बिंदु पर आप परीक्षण कर सकते हैं कि यह इसके साथ काम करता है:

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

अगर यह काम आप इसे स्थायी (-specs हर पारित करने के लिए कोई जरूरत नहीं)

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

ग्रेप पथ दिखाना चाहिए कर सकते हैं जहां डिफ़ॉल्ट specs फ़ाइल के लिए gcc देखो।

specs फ़ाइलों इतनी छूट सशर्त जोड़ने चर पर निर्भर करता है अनुमति देने के लिए कर रहे हैं, उदाहरण के लिए:

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

mabi (अपरीक्षित, अभी तक) के आधार पर अलग है और कई रास्तों का उपयोग करना चाहिए, %Rsysroot पथ, कर सकते हैं होना चाहिए आवश्यक पूर्ण पथ के साथ बदला जा सकता है।

अभी तक link धारा (उस पर काम कर) साथ उपयोग करने के लिए कैसे एक --with-specs= विकल्प gcc configure अंत में निर्माण समय में प्रयोग की जाने वाली भी है, मेरे लिए स्पष्ट नहीं है।

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

यह काम करते हैं, मैं दोनों shared और नहीं !shared सिर्फ परीक्षण के लिए, शायद कुछ होशियार हालत इस्तेमाल किया जाना चाहिए इस्तेमाल किया, ध्यान दें कि यह -dumpspecs साथ सूचना नहीं है।

जीसीसी मेलिंग सूची मैं छाप specs हर किसी के द्वारा पसंद नहीं कर रहे हैं के लिए किया था के कुछ धागे के माध्यम से पढ़ना (लेकिन 4.9 अगर मैं गलत नहीं कर रहा हूँ एक और विकल्प --with-extra-specs जोड़ने) इस तरह के अनुकूलन करने के लिए बजाय पसंदीदा तरीका configure.host प्रतीत होता है, लेकिन मैं कर रहा हूं और इसमें नहीं देख रहा हूं, मजा करो!:-)

यह भी देखें: gcc faq rpath

अद्यतन ऊपर

मैं तुम्हें सेट कर सकते हैं, तो पता नहीं है एक पूर्व निर्धारित rpath, शायद अगर आप binutils की ld लिंकर में होगा कर सकते हैं gcc/g++ में नहीं, लेकिन आप ऐसा क्यों करेंगे?

बस का निर्माण समय

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

ldd पर रनटाइम पर LD_LIBRARY_PATH और LD_RUN_PATH निर्यात पथ आप निर्यात दिखाना चाहिए। जब किसी साझा लाइब्रेरी libtool साथ बनाया गया है

संदेश दिया शब्दों में:

यदि आप कभी भी उपयोग libtool, तो आपको या तो किसी निर्देशिका में स्थापित पुस्तकालयों के खिलाफ लिंक करने के लिए LIBDIR, और निर्दिष्ट चाहते हैं तो पुस्तकालय का पूरा पथ नाम, या 'लिंक करने के दौरान झंडा और निम्न में से कम से कम एक कार्य करें:

  • `LD_LIBRARY_PATH को LIBDIR जोड़ें'` -LLIBDIR का उपयोग निष्पादन के दौरान वातावरण चर
  • को LIBDIR जोड़ने `एलडी_आरयूएन_PATH 'envi जोड़ने
  • का उपयोग `-Wl दौरान ronment चर, - rpath -Wl, LIBDIR

देखें 'लिंकर झंडा

  • अपने सिस्टम व्यवस्थापक से जोड़ने LIBDIR को` /etc/ld.so.conf है' के लिए साझा पुस्तकालयों के बारे में कोई भी ऑपरेटिंग सिस्टम दस्तावेज, जैसे एलडी (1) और ld.so (8) मैन्युअल पेज।

  • पूर्णता Makefile मैं बात के परीक्षण के लिए इस्तेमाल किया, सभी कॉन्फ़िगर विकल्प, वातावरण चर (बूट LDFLAGS देखें) मैं काम नहीं किया की कोशिश की के लिए , --enable-rpath शामिल थे।

    mkdir ~/gcc साथ

    उपयोग ~/gcc में Makefile नीचे कॉपी तो cd ~/gcc && make build-gcc

    नोटिस विकल्पों का इस्तेमाल किया ही इस परीक्षण मामले के लिए कर रहे हैं, संदर्भ के रूप में प्रयोग नहीं करते।

    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

    मैं अगर यह 2014 में अभी तक अस्तित्व में नहीं था पता नहीं है, लेकिन अब के लिए यह शायद एक बेहतर विचार है 'उपयोग करने के लिए * लिंक: + -rpath =/usr/स्थानीय/करने के लिए की तुलना में lib64' वास्तव में संशोधित प्राथमिक '* लिंक' spec स्ट्रिंग लाइन। –

    संबंधित मुद्दे