<Trước | Nội dung | Tiếp theo>
6.21.1. Cài đặt GCC
Nếu xây dựng trên x86_64, hãy thay đổi tên thư mục mặc định cho các thư viện 64-bit thành “lib”:
case $ (uname -m) trong x86_64)
sed -e '/ m64 = / s / lib64 / lib /' \
-i.orig gcc / config / i386 / t-linux64
;;
nó C
case $ (uname -m) trong x86_64)
sed -e '/ m64 = / s / lib64 / lib /' \
-i.orig gcc / config / i386 / t-linux64
;;
nó C
Tài liệu GCC khuyến nghị xây dựng GCC trong một thư mục xây dựng chuyên dụng:
mkdir -v xây dựng cd xây dựng
mkdir -v xây dựng cd xây dựng
Chuẩn bị GCC để biên dịch:
SED = sed \
../configure --prefix = / usr \
--enable-Languages = c, c ++ \
--disable-multilib \
--disable-bootstrap \
--with-system-zlib
SED = sed \
../configure --prefix = / usr \
--enable-Languages = c, c ++ \
--disable-multilib \
--disable-bootstrap \
--with-system-zlib
Lưu ý rằng đối với các ngôn ngữ khác, có một số điều kiện tiên quyết chưa có sẵn. Xem Sách BLFS để biết hướng dẫn về cách tạo tất cả các ngôn ngữ được hỗ trợ của GCC.
Ý nghĩa của các tham số cấu hình mới:
SED = sed
Việc đặt biến môi trường này sẽ ngăn chặn một đường dẫn được mã hóa cứng đến / tools / bin / sed.
--with-system-zlib
Công tắc này yêu cầu GCC liên kết với bản sao được cài đặt hệ thống của thư viện Zlib, thay vì bản sao nội bộ của chính nó.
Biên dịch gói:
làm cho
làm cho
Quan trọng
Trong phần này, bộ thử nghiệm cho GCC được coi là rất quan trọng. Đừng bỏ qua nó trong bất kỳ hoàn cảnh nào.
Quan trọng
Trong phần này, bộ thử nghiệm cho GCC được coi là rất quan trọng. Đừng bỏ qua nó trong bất kỳ hoàn cảnh nào.
Một bộ thử nghiệm trong bộ thử nghiệm GCC được biết là có thể làm cạn kiệt ngăn xếp, vì vậy hãy tăng kích thước ngăn xếp trước khi chạy thử nghiệm:
ulimit -s 32768
ulimit -s 32768
Kiểm tra kết quả với tư cách là người dùng không có đặc quyền, nhưng không dừng lại ở lỗi:
chown -Rv không ai cả.
su ai -s / bin / bash -c "PATH = $ PATH make -k check"
chown -Rv không ai cả.
su ai -s / bin / bash -c "PATH = $ PATH make -k check"
Để nhận bản tóm tắt kết quả bộ thử nghiệm, hãy chạy:
../contrib/test_summary
../contrib/test_summary
Chỉ đối với các bản tóm tắt, hãy chuyển đầu ra qua grep -A7 Tóm tắt.
Kết quả có thể được so sánh với kết quả tại http://www.linuxfromscratch.org/lfs/build-logs/9.0/ và https: //gcc.gnu. org / ml / gcc-testresults /.
Sáu bài kiểm tra liên quan đến get_time được biết là không thành công. Chúng dường như liên quan đến ngôn ngữ en_HK.
Hai thử nghiệm có tên lookup.cc và reverse.cc trong thử nghiệm / net được biết là không thành công trong môi trường chroot LFS vì chúng yêu cầu / etc / hosts và iana-etc.
Hai bài kiểm tra có tên pr57193.c và pr90178.c được biết là không đạt.
Không phải lúc nào cũng có thể tránh được một vài thất bại bất ngờ. Các nhà phát triển GCC thường nhận thức được những vấn đề này, nhưng vẫn chưa giải quyết chúng. Trừ khi kết quả kiểm tra khác biệt nhiều so với kết quả tại URL ở trên, nếu không bạn có thể tiếp tục.
Cài đặt gói và xóa một thư mục không cần thiết:
thực hiện cài đặt
rm -rf / usr / lib / gcc / $ (gcc -dumpmachine) /9.2.0/include-fixed/bits/
thực hiện cài đặt
rm -rf / usr / lib / gcc / $ (gcc -dumpmachine) /9.2.0/include-fixed/bits/
Thư mục bản dựng GCC thuộc sở hữu của không có ai bây giờ và quyền sở hữu của thư mục tiêu đề đã cài đặt (và nội dung của nó) sẽ không chính xác. Thay đổi quyền sở hữu thành nguồn gốc người dùng và nhóm:
chown -v -R root: root \
/usr/lib/gcc/*linux-gnu/9.2.0/include{,-fixed}
chown -v -R root: root \
/usr/lib/gcc/*linux-gnu/9.2.0/include{,-fixed}
Tạo liên kết biểu tượng theo yêu cầu của FHS vì lý do "lịch sử".
ln -sv ../usr/bin/cpp / lib
ln -sv ../usr/bin/cpp / lib
Nhiều gói sử dụng tên cc để gọi trình biên dịch C. Để đáp ứng các gói đó, hãy tạo một liên kết biểu tượng:
ln -sv gcc / usr / bin / cc
ln -sv gcc / usr / bin / cc
Thêm liên kết tượng trưng tương thích để cho phép xây dựng chương trình với Tối ưu hóa thời gian liên kết (LTO):
cài đặt -v -dm755 / usr / lib / bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine) /9.2.0/liblto_plugin.so \
/ usr / lib / bfd-plugins /
cài đặt -v -dm755 / usr / lib / bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine) /9.2.0/liblto_plugin.so \
/ usr / lib / bfd-plugins /
Bây giờ chuỗi công cụ cuối cùng của chúng tôi đã có, điều quan trọng là phải đảm bảo rằng việc biên dịch và liên kết sẽ hoạt động như mong đợi. Chúng tôi thực hiện điều này bằng cách thực hiện các kiểm tra độ tỉnh táo giống như chúng tôi đã làm trước đó trong chương:
echo 'int main () {}'> dummy.c
cc dummy.c -v -Wl, - verbose &> dummy.log readelf -l a.out | grep ': / lib'
echo 'int main () {}'> dummy.c
cc dummy.c -v -Wl, - verbose &> dummy.log readelf -l a.out | grep ': / lib'
Sẽ không có lỗi và đầu ra của lệnh cuối cùng sẽ là (cho phép sự khác biệt về nền tảng cụ thể trong tên trình liên kết động):
[Yêu cầu trình thông dịch chương trình: /lib64/ld-linux-x86-64.so.2]
[Yêu cầu trình thông dịch chương trình: /lib64/ld-linux-x86-64.so.2]
Bây giờ, hãy đảm bảo rằng chúng tôi đã thiết lập để sử dụng đúng các tệp bắt đầu:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
Đầu ra của lệnh cuối cùng phải là:
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crt1.o đã thành công
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o đã thành công
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o đã thành công
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crt1.o đã thành công
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o đã thành công
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o đã thành công
Tùy thuộc vào kiến trúc máy của bạn, ở trên có thể khác một chút, sự khác biệt thường là tên của thư mục sau / usr / lib / gcc. Điều quan trọng cần tìm ở đây là gcc đã tìm thấy cả ba crt * .o các tập tin dưới / Usr / lib thư mục.
Xác minh rằng trình biên dịch đang tìm kiếm các tệp tiêu đề chính xác:
grep -B4 '^ / usr / include' dummy.log
grep -B4 '^ / usr / include' dummy.log
Lệnh này sẽ trả về kết quả đầu ra sau:
#include <...> tìm kiếm bắt đầu ở đây:
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include
/ usr / local / bao gồm
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed
/ usr / bao gồm
#include <...> tìm kiếm bắt đầu ở đây:
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include
/ usr / local / bao gồm
/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed
/ usr / bao gồm
Một lần nữa, hãy lưu ý rằng thư mục được đặt tên theo bộ ba mục tiêu của bạn có thể khác với thư mục trên, tùy thuộc vào kiến trúc của bạn.
Tiếp theo, xác minh rằng trình liên kết mới đang được sử dụng với các đường dẫn tìm kiếm chính xác:
grep 'TÌM KIẾM. * / usr / lib' dummy.log | sed 's |; | \ n | g '
grep 'TÌM KIẾM. * / usr / lib' dummy.log | sed 's |; | \ n | g '
Các tham chiếu đến đường dẫn có các thành phần với '-linux-gnu' nên bị bỏ qua, nhưng nếu không thì kết quả đầu ra của lệnh cuối cùng sẽ là:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64") SEARCH_DIR("/usr/local/lib64") SEARCH_DIR("/lib64")
SEARCH_DIR ("/ usr / lib64") SEARCH_DIR ("/ usr / x86_64-pc-linux-gnu / lib") SEARCH_DIR ("/ usr / local / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib");
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64") SEARCH_DIR("/usr/local/lib64") SEARCH_DIR("/lib64")
SEARCH_DIR ("/ usr / lib64") SEARCH_DIR ("/ usr / x86_64-pc-linux-gnu / lib") SEARCH_DIR ("/ usr / local / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib");
Hệ thống 32-bit có thể thấy một số thư mục khác nhau. Ví dụ, đây là đầu ra từ máy i686:
SEARCH_DIR ("/ usr / i686-pc-linux-gnu / lib32") SEARCH_DIR ("/ usr / local / lib32") SEARCH_DIR ("/ lib32")
SEARCH_DIR ("/ usr / lib32") SEARCH_DIR ("/ usr / i686-pc-linux-gnu / lib") SEARCH_DIR ("/ usr / local / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib");
SEARCH_DIR ("/ usr / i686-pc-linux-gnu / lib32") SEARCH_DIR ("/ usr / local / lib32") SEARCH_DIR ("/ lib32")
SEARCH_DIR ("/ usr / lib32") SEARCH_DIR ("/ usr / i686-pc-linux-gnu / lib") SEARCH_DIR ("/ usr / local / lib") SEARCH_DIR ("/ lib")
SEARCH_DIR ("/ usr / lib");
Tiếp theo, hãy đảm bảo rằng chúng ta đang sử dụng libc chính xác:
grep "/lib.*/libc.so.6" dummy.log
grep "/lib.*/libc.so.6" dummy.log
Đầu ra của lệnh cuối cùng phải là:
cố gắng mở /lib/libc.so.6 đã thành công
cố gắng mở /lib/libc.so.6 đã thành công
Cuối cùng, hãy đảm bảo GCC đang sử dụng đúng trình liên kết động:
grep tìm thấy dummy.log
grep tìm thấy dummy.log
Đầu ra của lệnh cuối cùng phải là (cho phép sự khác biệt theo nền tảng cụ thể trong tên trình liên kết động):
tìm thấy ld-linux-x86-64.so.2 tại /lib/ld-linux-x86-64.so.2
tìm thấy ld-linux-x86-64.so.2 tại /lib/ld-linux-x86-64.so.2
Nếu đầu ra không xuất hiện như hình trên hoặc hoàn toàn không nhận được, thì có điều gì đó nghiêm trọng đã xảy ra. Điều tra và kiểm tra lại các bước để tìm ra vấn đề ở đâu và khắc phục nó. Lý do rất có thể là đã xảy ra sự cố với việc điều chỉnh tệp thông số kỹ thuật. Mọi vấn đề sẽ cần được giải quyết trước khi tiếp tục quá trình.
Khi mọi thứ hoạt động bình thường, hãy dọn dẹp các tệp thử nghiệm:
rm -v dummy.c a.out dummy.log
rm -v dummy.c a.out dummy.log
Cuối cùng, di chuyển một tệp bị thất lạc:
mkdir -pv / usr / share / gdb / auto-load / usr / lib
mv -v /usr/lib/*gdb.py / usr / share / gdb / auto-load / usr / lib
mkdir -pv / usr / share / gdb / auto-load / usr / lib
mv -v /usr/lib/*gdb.py / usr / share / gdb / auto-load / usr / lib
<Trước | Nội dung | Tiếp theo>