Làm thế nào để bạn xây dựng các phiên bản gcc cũ? Lỗi về crti.o không được tìm thấy


10

Làm cách nào tôi có thể xây dựng một gcc cũ hơn (cụ thể là 4.5.2) trên Ubuntu 11.10 và tránh các lỗi về "/ usr / bin / ld: không thể tìm thấy crti.o: Không có tệp hoặc thư mục như vậy"?

Tôi đã thực hiện một chút đào và tìm thấy một số mặt hàng tương tự, nhưng không có mặt hàng nào thực sự giải quyết vấn đề của tôi:

  • Tôi đã xác minh tất cả các gói của tôi (libc6-dev và tương tự) được cài đặt lại cho câu hỏi này
  • Tôi đã xác minh crti.o tồn tại trong / usr / lib32 và / usr / lib / x86_64-linux-gnu và ld.so.conf của tôi được định cấu hình để tìm trong các thư mục đó
  • Tôi đã xác minh rằng việc chuẩn bị lệnh gọi thực hiện của mình với LIBRARY_PATH = / usr / lib / x86_64-linux-gnu hoạt động, nhưng muốn tránh điều này (nó trở thành một điểm chuyển hướng trong tệp tạo tệp)
  • Tôi đã thử nhiều thứ khác nhau với - với-build-sysroot, nhưng không thành công (đọc: có lẽ tôi chỉ không biết đặt cờ đúng)
  • Khi chạy với strace (theo câu trả lời này ), tôi có thể thấy tham chiếu trần đến crti.o:

    13240 mở ("crti.o", O_RDONLY) = -1 ENOENT (Không có tệp hoặc thư mục như vậy)

Cảm ơn!

Câu trả lời:


7

Tôi đã từng gặp vấn đề tương tự. Tạo liên kết tượng trưng từ /usr/libs/crt?.o để /usr/lib/x86_64-linux-gnu/crt?.ogiải quyết vấn đề cho tôi.


Điều này không hoạt động, vâng. Tôi đã hy vọng một giải pháp phù hợp hơn với các dòng điều chỉnh cài đặt gcc thay vì mucking với các cấu trúc tệp cơ bản, mặc dù ...
Matt

Tôi muốn thêm rằng trong trường hợp của mình, tôi đã biên dịch lại glibc và GCC, nhưng tôi đã quên loại bỏ một biến thể slackware-gcc cũ hơn có tại / usr / bin /. Khi tôi loại bỏ cái sau, tôi có thể biên dịch lại một số thứ nhất định (chẳng hạn như gcc một lần nữa).
shevy

10

Ngay cả các phiên bản GCC rất mới cũng thất bại với thông điệp đó. Đó là vì các bản phát hành Debian / Ubuntu mới (sẽ) hỗ trợ multiarch (tức là cài đặt nhị phân cho nhiều máy trong một hệ thống tệp), do đó các thư viện đã được chuyển đi khỏi các vị trí tiêu chuẩn.

Có các bản vá GCC để sửa nó ở đây (có thể chưa được phê duyệt phiên bản cuối cùng, nhưng chính xác cho Ubuntu), và có lẽ chúng có thể áp dụng cho GCC cũ hơn mà không cần nhiều nỗ lực. Tôi nghĩ bạn cần định cấu hình GCC với --enable-multiarch hoặc một cái gì đó.

Trong khi đó, tạo các liên kết mềm là một bản sửa lỗi tốt:

cd /usr/lib
ln -s x86_64-linux-gnu/crt*.o .

(tên thư mục sẽ khác khi cài đặt 32 bit).

Mong rằng sẽ giúp.


Cảm ơn cho quan điểm về nó là multiarch. Tôi đã hy vọng giải quyết "tại sao" nó ngừng hoạt động.
Matt

2

Tôi đã giải quyết vấn đề này bằng một vài cách giải quyết có thể hữu ích cho bạn.

Đầu tiên, xây dựng GCC với LIBRARY_PATH=/usr/lib/x86_64-linux-gnu, để quá trình xây dựng bootstrap biết nơi tìm các crt?.otệp bắt đầu.

Sau đó, thay vì tạo crt?.oliên kết tượng trưng ở /usr/libnơi chúng ảnh hưởng đến toàn bộ hệ thống của bạn, bạn có thể liên kết ba tệp đó vào ${prefix}/lib/gcc/...thư mục tương ứng với ${prefix}/binthư mục mà gcctệp thực thi được cài đặt. Điều đó thực sự nằm ở đầu đường dẫn tìm kiếm của tệp bắt đầu nó sẽ tìm thấy chúng - nhưng chúng không ảnh hưởng gì khác.

Trong trường hợp của tôi, thư mục cụ thể để đặt chúng vào là lib/gcc/x86_64-unknown-linux-gnu/4.3.2/; bạn có thể tìm đúng vì nó đã có các tệp khác như crtbegin.otrong đó.


1

Tôi đã xây dựng GCC 4.1.2 trên Ubuntu chính xác x86_64. Như bạn đã làm, tôi đã xem xét các bước của lệnh cuối cùng "xgcc" tìm kiếm thời gian chạy 32 bit c, grep-ped / 32 / như sau. Thời gian chạy C trong của tôi là trong / usr / lib32, được cung cấp bởi gói libc6-dev-i386.

fgrep /32/ strace-output.txt | grep /usr/lib | head -1
access("/usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32/crti.o", R_OK) = -1 ENOENT (No such file or directory)

Vì vậy, tôi đã tạo ra các liên kết crt? .O trong thư mục xgcc tìm kiếm.

sudo mkdir -p /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
cd /usr/lib/gcc/x86_64-unknown-linux-gnu/4.1.2/32
sudo ln -s /usr/lib32/crt1.o 
sudo ln -s /usr/lib32/crtn.o 
sudo ln -s /usr/lib32/crti.o 

Tôi đã xây dựng thành công GCC 4.1.2 với nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.