2012-11-11 37 views
5

Tôi đang cố gắng xây dựng và cài đặt gcc 4.7.2 của riêng mình trong/usr/local để sử dụng thay cho gcc 4.4.6 trong/usr. (Đây là trên CentOS 6.3.)Làm thế nào để xây dựng và cài đặt gcc với rpath tích hợp?

gcc làm cho tệp thi hành và thư viện động liên kết động với thư viện động riêng của nó, ví dụ: libstdC++. Làm cách nào để xây dựng và cài đặt gcc để các tệp nhị phân được tạo tự động nhận được tùy chọn liên kết -rpath (-rpath/usr/local/lib64) khiến thư viện động trong/usr/local/lib64 được liên kết thay vì các thư mục trong/usr/lib64 hoặc/lib64?

Nếu nó hoạt động đúng, sau khi tôi xây dựng tệp thực thi với gcc mà không chỉ định "-Wl, -rpath =/usr/local/lib64", khi tôi ldd tệp thực thi, nó sẽ hiển thị/usr/local/lib64/libstdC++. so.6 thay vì /usr/lib64/libstdc++.so.6. Tương tự cho libgcc_s.so.1.

Tôi đã thử các cách tiếp cận khác nhau, bao gồm chỉ định LDFLAGS_FOR_TARGET = -Wl, -rpath =/usr/local/lib64, -rpath =/usr/local/lib trên dòng lệnh 'configure', nhưng không có gì hoạt động.

Trả lời

2

Nếu bạn không muốn xuất đường có một giải pháp thay thế:

với toolchain của bạn trong PATH:

gcc -dumpspecs > specsfile 

chỉnh sửa specsfile và trong phần link thêm -rpath ví dụ của bạn:

*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 

vào thời điểm này, bạn có thể kiểm tra xem nó có hoạt động với:

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

nếu nó hoạt động bạn có thể làm cho nó vĩnh viễn (không cần phải vượt qua -specs mọi)

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

grep sẽ hiển thị đường dẫn nơi gcc nhìn cho các tập tin mặc định specs.

Các specs file đủ linh hoạt để cho phép có điều kiện liên kết phụ thuộc vào các biến, ví dụ:

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

nên sử dụng đường dẫn khác nhau và nhiều tùy thuộc vào mabi (chưa được kiểm tra, tuy nhiên), %R nên con đường sysroot, có thể được thay đổi với đường dẫn đầy đủ cần thiết.

Ngoài ra còn có một tùy chọn --with-specs=gcc configure cuối cùng sẽ được sử dụng tại thời gian xây dựng , không rõ ràng với tôi nhưng làm thế nào để sử dụng với link phần (làm việc trên nó).

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

Nó làm việc, tôi đã sử dụng cả hai shared và không !shared chỉ cho thử nghiệm, có thể một số điều kiện thông minh hơn nên được sử dụng, lưu ý rằng nó không được báo cáo với -dumpspecs.

Đọc qua một số chủ đề của mailing list gcc Tôi có cảm giác specs không thích bởi tất cả mọi người (nhưng nếu tôi không sai 4.9 bổ sung thêm tùy chọn --with-extra-specs) cách thay ưa thích để làm các tùy chỉnh như vậy dường như là configure.host, nhưng tôi đã hoàn thành và không nhìn vào nó, hãy vui vẻ!:-)

also see: gcc faq rpath

cập nhật trên

Tôi không biết nếu bạn có thể đặt được xác định trước rpath, có lẽ nếu bạn có thể sẽ là trong mối liên kết ld của binutils không phải trong số gcc/g++, nhưng tại sao bạn lại làm vậy?

Chỉ cần xuất LD_LIBRARY_PATH trong thời gian chạy và LD_RUN_PATH ở thời gian xây dựng

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

ldd sẽ hiển thị đường dẫn bạn xuất khẩu.

Để trích dẫn một thông điệp đưa ra khi một thư viện chia sẻ được xây dựng với libtool:

Nếu bạn đã từng xảy ra với muốn liên kết với các thư viện được cài đặt trong một thư mục nào đó, LIBDIR, bạn phải sử dụng libtool, và chỉ định tên đường dẫn đầy đủ của thư viện, hoặc gõ `-LLIBDIR 'cờ trong liên kết và làm ít nhất một trong các cách sau:

  • thêm LIBDIR đến' LD_LIBRARY_PATH' biến môi trường trong quá trình thực
  • thêm LIBDIR đến `LD_RUN_PATH 'envi ronment biến trong liên kết
  • gõ `-Wl, - rPath -Wl, LIBDIR 'mối liên kết cờ
  • có quản trị viên hệ thống của bạn thêm LIBDIR cho` /etc/ld.so.conf'

Xem bất kỳ tài liệu hệ điều hành nào về các thư viện được chia sẻ cho thông tin khác, chẳng hạn như các trang hướng dẫn sử dụng ld (1) và ld.so (8).

cho đầy đủ các Makefile tôi đã sử dụng để thử nghiệm điều, tất cả các tùy chọn cấu hình, biến môi trường (xem ldflags boot) Tôi cố gắng không làm việc, --enable-rpath bao gồm.

sử dụng với mkdir ~/gcc copy Makefile dưới đây vào ~/gcc sau đó cd ~/gcc && make build-gcc

thông báo các tùy chọn được sử dụng là chỉ dành cho trường hợp thử nghiệm này, không sử dụng như tài liệu tham khảo.

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

Tôi không biết nếu điều này chưa tồn tại trong năm 2014, nhưng hiện tại có thể nên sử dụng '* link: + -rpath =/usr/local/lib64' hơn để thực sự sửa đổi dòng chuỗi thông số chính '* link'. –

Các vấn đề liên quan