2012-12-01 20 views
8

Tôi có một hệ thống mà tôi không có quyền truy cập root, nhưng tôi cần phải cài đặt phiên bản hiện tại của GCC (4.7.2).Xây dựng GCC với glibc ở một vị trí không chuẩn mà không có gốc

Hệ thống đang chạy phiên bản x86_64 của Linux 2.6.18 và đã có GCC 4.1 (không hỗ trợ C++ mặc dù --version cho biết nó được xây dựng với nó).

EDIT 5: Tại thời điểm này, các bước dưới đây chỉ là một tập hợp những thứ tôi đã thử. Tôi đã bắt đầu làm sạch một vài lần kể từ đó. Tôi đang tìm ai đó để trình bày chi tiết thứ tự chính xác mà tôi cần để làm mọi thứ với tất cả các công tắc được yêu cầu.

Đây là quá trình tôi đã trải qua cho đến nay (nơi ROOT là một thư mục trong thư mục chính của tôi)

make-3.82>./configure --prefix=$ROOT && make && make install && hash -r 
binutils-2.23>./configure --prefix=$ROOT && make && make install 
autoconf-2.69>./configure --prefix=$ROOT && make && make install 
automake-1.9>./configure --prefix=$ROOT && make && make install 
flex-2.5.37>./configure --prefix=$ROOT && make && make install 
libunwind-1.1>./configure --prefix=$ROOT && make && make install 
gcc-4.7.2-scratch>../gcc-4.7.2/configure --prefix=$ROOT \ 
    --disable-multilib --disable-nls --enable-languages=c,c++ \ 
    && make && make install && hash -r 
ncurses-5.9>./configure --prefix=$ROOT && make && make install 
texinfo-4.13>./configure --prefix=$ROOT && make && make install 
glibc-2.14-scratch>touch $ROOT/etc/ld.so.conf 

Patched glibc với bản vá từ http://sourceforge.net/apps/trac/unattended/wiki/ModifyingTheBootDisk#PatchGLibc (số dòng chỉnh cho 2.14)

glibc-2.14-scratch>../glibc-2.14/configure --prefix=$ROOT \ 
    --with-headers=$3_3_4_HEADERS && make && make install 

Cờ tôi đã thêm là để loại bỏ undefined reference to '__isoc99_sscanf'. Tôi không biết sự kết hợp của lá cờ thực sự cần thiết để sửa chữa điều đó, nhưng nó đã khắc phục vấn đề với những lá cờ này.

gcc-4.7.2-scratch2>../gcc-4.7.2/configure --prefix=$ROOT \ 
    --disable-multilib --disable-nls --enable-languages=c,c++ \ 
    CPPFLAGS="-I$ROOT/include" CFLAGS="-g -O2 -lc" \ 
    CXXFLAGS="-g -O2 -lc" LDFLAGS="-L$ROOT/lib \ 
    -L$ROOT/lib64" && make && make install 

Bây giờ tôi nhận được lỗi này trong GCC xây dựng:

build/genmddeps ../../gcc-4.7.2/gcc/config/i386/i386.md > tmp-mddeps 
build/genmddeps: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by build/genmddeps) 

Các lỗi có ý nghĩa vì libc trong/lib64 là phiên bản 2.5, nhưng tôi không biết làm thế nào để có được GCC sử dụng cái mà tôi đã cài đặt để $ ROOT/lib.

EDIT 1: Thêm -rpath không giúp được gì, nhưng tôi đã thêm thư mục lib của mình vào LD_RUN_PATH và LD_LIBRARY_PATH. Với những bộ này tôi không thể chạy bất cứ điều gì vì tôi đã gặp lỗi [program_name]: error while loading shared libraries: /home/mrambiguous/root/lib/libc.so.6: ELF file OS ABI invalid

Một điều lạ khác cần lưu ý là khi tôi thử đề xuất -rpath, tôi bắt đầu nhận được lỗi từ GCC về các tùy chọn dòng lệnh không được công nhận (như - V). Tôi đã phải thiết lập nó để sử dụng GCC 4.1 của hệ thống. Bây giờ tôi không chắc chắn nếu xây dựng GCC đầu tiên của tôi bị hỏng bằng cách nào đó hoặc nếu nó đã từng được sử dụng ở nơi đầu tiên.

CHỈNH SỬA 2: Tôi vừa mở libc.so.6 trong vim để xem tôi có thể tìm thấy bất kỳ điều gì về ABI ở dạng văn bản thuần túy hay không và nó có trong đó thông tin bản quyền. libc ABIs: UNIQUE IFUNC

Nó cũng xác nhận rằng GCC 4.7.2 đang làm việc trong cùng một khối văn bản. Compiled by GNU CC version 4.7.2

CHỈNH SỬA 3: Đã xóa $ ROOT, cài đặt lại mọi thứ, cùng vấn đề không nhận dạng -V và -qversion làm tùy chọn hợp lệ.

EDIT 4: Tôi cố gắng chỉnh sửa tiêu đề ELF bằng cách sử dụng brandelf -t SVR4 libc.so.6, nhưng điều đó chỉ mang lại cho tôi một lỗi mới unexpected PLT reloc type 0x25

+0

Vượt qua "-L $ ROOT/lib" thay thế hoặc làm phụ phí? – lynxlynxlynx

+0

Tôi đang làm điều đó. '../gcc-4.7.2/configure [snip] LDFLAGS =" - L $ ROOT/lib -L $ ROOT/lib64 "' –

+1

Bạn liên kết với libc của riêng bạn, nhưng bạn không nói kết quả thực thi ở đâu tìm 'libc' khi chạy. '-L' không làm điều đó, bạn cần' -rpath = $ ROOT' trong 'LDFLAGS' ngoài' -L'. –

Trả lời

4

Tôi vội vàng nên tôi không thể phân tích các thông báo lỗi của bạn một cách chi tiết.

Glibc mới và glibc cũ không chỉ ABI không tương thích, mà còn là tiêu đề, xem gcc bug 52922.

Vì vậy, bất kỳ sự pha trộn nào cũng sẽ dẫn đến lỗi như bạn gặp phải, bạn cần phải hết sức cẩn thận.

Điều chỉnh tay vô vọng tẻ nhạt.

Nếu mục tiêu của bạn là sử dụng gcc-4.7.2, tôi khuyên bạn nên Gentoo Prefix. Tôi có nhiều phiên bản Gentoo Prefix chạy trên RHEL 5 (có 2.6.18 kernel, gcc-4.1 và glibc-2.5 như bạn làm). Điều này biên dịch gcc-4.7.2 trên đỉnh glibc-2.5.

Nếu bạn muốn sử dụng glibc mới hơn, hãy xem Prefix/libc. Đó là một công việc trong tiến trình mặc dù. Mong đợi nhiều vỡ. Nhưng nó sẽ không phải là một trở ngại lớn khi bạn đang cố gắng để biên dịch một toolchain hiện đại bằng tay, phải không?

+1

Cảm ơn bạn đã cho tôi biết về dự án Gentoo Prefix! Điều này có lẽ sẽ là sự cứu rỗi của tôi trên hệ thống cũ này tôi đang sử dụng :) – SamGamgee

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