2012-12-11 34 views
7

Tôi đang cố gắng xây dựng gcc 4.7.2 bằng cách sử dụng tiền tố tùy chỉnh $PREFIXLàm thế nào tôi có thể thiết lập rpath trên gcc nhị phân trong bootstrap?

Tôi đã xây dựng và cài đặt tất cả các điều kiện tiên quyết vào vị trí tiền tố của mình, sau đó cấu hình thành công, xây dựng và cài đặt gcc.

Sự cố hiện tại của tôi là $PREFIX không có trong đường dẫn tìm kiếm thư viện và do đó không thể tìm thấy thư viện được chia sẻ.

$PREFIX/bin $ ./g++ ~/main.cpp 
$PREFIX/libexec/gcc/x86_64-suse-linux/4.7.2/cc1plus: \ 
    error while loading shared libraries: \ 
     libcloog-isl.so.1: \ 
      cannot open shared object file: No such file or directory 

gì hoạt động, nhưng không phải là lý tưởng

Nếu tôi export LD_LIBRARY_PATH=$PREFIX/lib sau đó nó hoạt động, nhưng tôi đang tìm kiếm cái gì đó làm việc mà không cần phải thiết lập các biến môi trường.

Nếu tôi sử dụng patchelf để đặt RPATH trên tất cả gcc nhị phân thì nó cũng hoạt động; tuy nhiên điều này liên quan đến việc tìm kiếm tất cả các tập tin nhị phân của elf và lặp lại chúng gọi là patchelf, tôi muốn có một cái gì đó vĩnh viễn hơn.

Những gì tôi nghĩ rằng sẽ là lý tưởng cho các mục đích của tôi

Vì vậy, tôi hy vọng có một cách để có -Wl,-rpath,$PREFIX/lib thông qua để thực hiện trong quá trình xây dựng.

Vì tôi biết đường dẫn sẽ không cần phải thay đổi, điều này có vẻ giống như giải pháp mạnh mẽ nhất và cũng có thể được sử dụng khi chúng tôi tạo phiên bản gcc tiếp theo.

Đang định cấu hình quy trình xây dựng thành mã cứng có thể RPATH?

Những gì tôi đã cố gắng, nhưng không hoạt động

Thiết LDFLAGS_FOR_TARGET trước khi gọi configure:

Tất cả những thất bại:

export LDFLAGS_FOR_TARGET="-L$PREFIX/lib -R$PREFIX/lib" 
export LDFLAGS_FOR_TARGET="-L$PREFIX/lib" 
export LDFLAGS_FOR_TARGET="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib" 

Thiết LDFLAGS trước khi gọi configure:

export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib" 

Trong mọi trường hợp, tôi lo lắng rằng những điều này sẽ ghi đè bất kỳ số nào trong số LDFLAGS gcc sẽ, vì vậy tôi không chắc chắn đây có phải là lựa chọn khả thi ngay cả khi chúng có thể được thực hiện để hoạt động không?

dòng cấu hình của tôi

Đối với đầy đủ ở đây là dòng tôi vượt qua để cấu hình:

./configure \ 
    --prefix=$PREFIX \ 
    --build=x86_64-suse-linux \ 
    --with-pkgversion='SIG build 12/10/2012' \ 
    --disable-multilib \ 
    --enable-cloog-backend=isl \ 
    --with-mpc=$PREFIX \ 
    --with-mpfr=$PREFIX \ 
    --with-gmp=$PREFIX \ 
    --with-cloog=$PREFIX \ 
    --with-ppl=$PREFIX \ 
    --with-gxx-include-dir=$PREFIX/include/c++/4.7.2 
+0

Nó sẽ không được 'LDFLAGS_ FOR_TARGET': có thể được sử dụng cho libgcc.so và libstdC++, nhưng không phải cho các tệp nhị phân của trình biên dịch vì chúng là * host * nhị phân. Tôi đã dự kiến ​​'LDFLAGS' là một trong những quyền. – ams

Trả lời

7

Tôi đã tìm thấy rằng sao chép thư mục nguồn cho gmp, mpfr, mpc, isl, cloog, v.v. vào thư mục nguồn gcc cấp cao nhất (hoặc sử dụng liên kết tượng trưng có cùng tên) hoạt động ở mọi nơi. Đây là thực tế là cách ưa thích.

Bạn cần phải sao chép (hoặc liên kết) vào các tên thư mục nguồn mà không cần số phiên bản để tính năng này hoạt động.

Các trình biên dịch không cần LD_LIBRARY_PATH (mặc dù các ứng dụng chạy được xây dựng với các trình biên dịch sẽ cần một LD_LIBRARY_PATH đến $ PREFIX/lib64 hoặc một cái gì đó như thế - nhưng đó là khác nhau)

Start trong một thư mục nguồn nơi bạn sẽ giữ tất cả các nguồn của bạn. Trong thư mục nguồn này, bạn có thư mục gcc của bạn bằng cách giải nén một tarball hoặc svn ... Tôi sử dụng subversion.

Cũng trong thư mục cấp cao nhất này, bạn có, nói rằng, các tarball nguồn sau:

gmp-5.1.0.tar.bz2 
mpfr-3.1.1.tar.bz2 
mpc-1.0.1.tar.gz 
isl-0.11.1.tar.bz2 
cloog-0.18.0.tar.gz 

Tôi chỉ cần tải những điều này và cập nhật cho các tarball mới nhất theo định kỳ.

Ở dạng kịch bản:

# Either: 
svn checkout svn://gcc.gnu.org/svn/gcc/trunk gcc_work 
# Or: 
bunzip -c gcc-4.8.0.tar.bz2 | tar -xvf - 
mv gcc-4.8.0 gcc_work 

# Uncompress sources.. (This will produce version numbered directories). 
bunzip -c gmp-5.1.0.tar.bz2 | tar -xvf - 
bunzip -c mpfr-3.1.1.tar.bz2 | tar -xvf - 
gunzip -c mpc-1.0.1.tar.gz | tar -xvf - 
bunzip -c isl-0.11.1.tar.bz2 | tar -xvf - 
gunzip -c cloog-0.18.0.tar.gz | tar -xvf - 

# Link outside source directories into the top level gcc directory. 
cd gcc_work 
ln -s ../gmp-5.1.0 gmp 
ln -s ../mpfr-3.1.1 mpfr 
ln -s ../mpc-1.0.1 mpc 
ln -s ../isl-0.11.1 isl 
ln -s ../cloog-0.18.0 cloog 

# Get out of the gcc working directory and create a build directory. I call mine obj_work. 
# I configure the gcc binary and other outputs to be bin_work in the top level directory. Your choice. But I have this: 
# home/ed/projects 
# home/ed/projects/gcc_work 
# home/ed/projects/obj_work 
# home/ed/projects/bin_work 
# home/ed/projects/gmp-5.1.0 
# home/ed/projects/mpfr-3.1.1 
# home/ed/projects/mpc-1.0.1 
# home/ed/projects/isl-0.11.1 
# home/ed/projects/cloog-0.18.0 

mkdir obj_work 
cd obj_work 
../gcc_work/configure --prefix=../bin_work <other options> 

# Your <other options> shouldn't need to involve anything about gmp, mpfr, mpc, isl, cloog. 
# The gcc build system will find the directories you linked, 
# then configure and compile the needed libraries with the necessary flags and such. 
# Good luck. 
+0

Bạn có thể cụ thể hơn, lý tưởng là một vài dòng lệnh, cho biết điều gì sẽ chạy ở đâu? Cảm ơn! – Jens

+0

@Jens Tôi đã thêm một tập lệnh cho những gì tôi làm. Đôi khi tôi chỉ cần sao chép các thư mục phụ thuộc thay vì liên kết mềm. – emsr

+0

Cảm ơn rất nhiều. Tôi đã phải sử dụng 'gmake all-binutils install-binutils all-gcc install-gcc' vì' gmake all install' sẽ thất bại ở đâu đó bởi vì nó không thể xác định một số hậu tố. Trong trường hợp của tôi, tôi không biên dịch bản địa, mà là một trình biên dịch chéo với '--target = powerpc-wrs-vxworks'. – Jens

5

Tôi đã sử dụng configure tùy chọn này với gcc-4.8.0, trên FreeBSD, sau khi xây dựng và lắp đặt gmp, isl và cloog:

LD_LIBRARY_PATH=/path/to/isl/lib ./configure (lots of other options) \ 
    --with-stage1-ldflags="-rpath /path/to/isl/lib -rpath /path/to/cloog/lib -rpath /path/to/gmp/lib" 

và kết quả nhị phân gcc không cần bất kỳ LD_LIBRARY_PATH. LD_LIBRARY_PATH để cấu hình là cần thiết vì nó biên dịch một chương trình thử nghiệm để kiểm tra phiên bản ISL, mà sẽ thất bại nếu nó không tìm thấy thư viện chia sẻ ISL.

Tôi đã thử nó trên Linux (Ubuntu), nơi nó không thành công trong quá trình cấu hình bởi vì -rpath args được chuyển đến gcc thay vì ld. Tôi có thể sửa lỗi này bằng cách sử dụng

--with-stage1-ldflags="-Wl,-rpath,/path/to/isl/lib,-rpath,/path/to/cloog/lib,-rpath,/path/to/gmp/lib" 

để thay thế.

+0

Cảm ơn! Điều này trông giống như những gì tôi cần. Tôi không biết về tùy chọn '--with-stage1-ldflags'; sẽ thử trên nền tảng của tôi và báo cáo lại! –

+0

Tất cả các tùy chọn cấu hình của GCC đều được ghi lại trên http://gcc.gnu.org/install/configure.html – Jens

0

Trong khi nó vẫn liên quan đến việc thiết lập các biến môi trường, những gì tôi làm là tôi xác định LD_RUN_PATH, thiết lập rPath. Bằng cách đó, phần còn lại của hệ thống có thể tiếp tục sử dụng các thư viện được cung cấp bởi hệ thống thay vì sử dụng các thư viện mà bản dựng gcc của bạn tạo ra.

0

Tôi sẽ đưa ra một đề nghị mà tôi tin rằng sẽ giải quyết được vấn đề của bạn, mặc dù nó chắc chắn không trả lời câu hỏi của bạn. Hãy xem có bao nhiêu downvotes tôi nhận được.

Viết tập lệnh trình bao bọc chung để đặt LD_LIBRARY_PATH và sau đó chạy tệp thực thi dễ dàng; xem https://stackoverflow.com/a/7101577/768469.

Ý tưởng là để vượt qua một cái gì đó giống như --prefix=$PREFIX/install để configure, xây dựng một cài đặt cây trông như thế này:

$PREFIX/ 
    install/ 
     lib/ 
      libcloogXX.so 
      libgmpYY.so 
      ... 
     bin/ 
      gcc 
      emacs 
      ... 
    bin/ 
     .wrapper 
     gcc -> .wrapper 
     emacs -> .wrapper 

.wrapper là một kịch bản đơn giản:

#!/bin/sh 

here="${0%/*}" # or use $(dirname "$0") 
base="${0##*/}" # or use $(basename "$0") 

libdir="$here"/../install/lib 
if [ "$LD_LIBRARY_PATH"x = x ] ; then 
    LD_LIBRARY_PATH="$libdir" 
else 
    LD_LIBRARY_PATH="$libdir":"$LD_LIBRARY_PATH" 
fi 
export LD_LIBRARY_PATH 
exec "$here"/../install/bin/"$base" "[email protected]" 

này sẽ chuyển tất cả các đối chính xác, xử lý không gian trong các đối số hoặc tên thư mục, v.v. Đối với mục đích thực tế, không thể phân biệt được thiết lập rpath như bạn muốn.

Ngoài ra, bạn có thể sử dụng phương pháp này không chỉ cho gcc, mà còn cho toàn bộ cây của tôi-cá nhân- $PREFIX. Tôi làm điều này mọi lúc trong môi trường nơi tôi muốn có một bộ công cụ GNU cập nhật, nhưng tôi không có (hoặc muốn thừa nhận có) quyền truy cập root.

0

Cố gắng thêm bạn $PREFIX để /etc/ld.so.conf và sau đó chạy ldconfig:

# echo $PREFIX >> /etc/ld.so.conf 
# ldconfig 

này sẽ tái tạo bộ nhớ cache được sử dụng bởi mối liên kết thời gian chạy và nó sẽ nhặt thư viện của bạn.

CẢNH BÁO: Thao tác này sẽ làm cho TẤT CẢ các ứng dụng để sử dụng thư viện mới được biên soạn của bạn trong $PREFIX thay vì vị trí mặc định

2

Chỉ cần sử dụng configure --with-stage1-ldflags="-Wl,-rpath,/path/to/lib" là không đủ cho tôi để xây dựng gcc 4.9.2, bootstrap thất bại trong giai đoạn 2 . Điều gì làm việc là để vượt qua anh cờ trực tiếp để làm cho qua

make BOOT_LDFLAGS="-Wl,-rpath,/path/to/lib" 

tôi nhận này từ https://gcc.gnu.org/ml/gcc/2008-09/msg00214.html

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