2012-12-09 20 views
6

Tôi đã cài đặt Matlab trong Linux Mint 14 Nadia của tôi (một uname -a hiển thị: Linux Ideapad-Z570 3.5.0-17-chung # 28-Ubuntu SMP Thứ ba ngày 9 tháng 10 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux) và khi gọi nó từ dòng lệnh, tôi sẽ nhận được một: "/ lib64/libc.so không tìm thấy".Sự khác nhau giữa /lib/i386-linux-gnu/libc.so.6, /lib/x86_64-linux-gnu/libc.so.6 và /usr/lib/x86_64-linux-gnu/libc.so là gì ?

Tôi đi theo sự giúp đỡ trên MathWorks bằng cách làm cho một liên kết trong/lib64 như:

ln -s /lib/x86_64-linux-gnu/libc.so.6 . 

Đó giải quyết vấn đề này.

Bây giờ, nếu tôi là một xác định vị trí của thư viện này tôi nhận được:

locate "libc.so" 
/lib/i386-linux-gnu/libc.so.6 
/lib/x86_64-linux-gnu/libc.so.6 
/usr/lib/x86_64-linux-gnu/libc.so 

tôi sẽ được biên dịch với gcc trong máy tính này và tôi muốn có sưu 64bit đầy đủ. Có nghĩa là gì để có tất cả các thư viện libc.so khác nhau này? trình biên dịch gnu nào sẽ sử dụng? thế nào để tôi cần phải làm bất cứ điều gì khác nhau với gcc để biên dịch cho 64 bit?

Tôi cũng muốn tối ưu hóa nhiều nhất có thể cho lõi i7 mới của mình !!!

+0

user1889975, Xin chào. Bạn có chắc rằng tất cả 3 'libc.so's khác nhau không? Thực hiện một 'ls -l' để tìm các liên kết tượng trưng. Ngoài ra, có một thay đổi gần đây trong đường dẫn mặc định tới 32/64bit libs trên các hệ thống 32/64 bit hỗn hợp (từ '/ lib64' đến'/lib/tr-ip-le/'), hãy kiểm tra trang này để biết thông tin bổ sung http: //wiki.debian.org/Multiarch/TheCaseForMultiarch – osgx

+0

Tôi đã kiểm tra và chúng KHÔNG phải là liên kết tượng trưng. Cảm ơn bạn đã đề xuất – Alejandro

Trả lời

10

/lib/i386-linux-gnu/libc.so.6

này là phiên bản 32-bit của thư viện.

/lib/x86_64-linux-gnu/libc.so.6

Đây là phiên bản 64-bit của thư viện.

Cả hai đều là các liên kết thường tượng trưng đến tập tin thư viện thực tế, mà thường sẽ được đặt tên theo số glibc phát hành, ví dụ libc-2.15.so

/usr/lib/x86_64-linux-gnu/libc.so

Đây không phải là thư viện, mà là tệp tập lệnh liên kết, đề cập đến các liên kết tượng trưng ở trên.

Tại sao chúng ta cần tất cả những:

Thứ nhất, bất kể phiên bản libc được cài đặt, các mối liên kết sẽ luôn luôn tìm kiếm libc.so, bởi vì người lái xe trình biên dịch sẽ luôn luôn vượt qua các mối liên kết các -lc tùy chọn. Tên libc vẫn giữ nguyên và biểu thị cho phiên bản mới nhất của thư viện.

Các liên kết tượng trưng libc.so.6 được đặt tên theo số soname của thư viện, ít nhiều tương ứng với phiên bản ABI của thư viện. Thực thi, được liên kết với libc.so trong thực tế có chứa các phụ thuộc thời gian chạy trên libc.so.6.

Nếu chúng ta tưởng tượng một ngày nào đó một hiển nhiên ABI không tương thích libc được phát hành, nó soname có thể được đặt tên libc.so.7, ví dụ và phiên bản coukld này cùng tồn tại với các phiên bản cũ hơn libc.so.6, do đó thực thi liên quan đối với một hay cách khác có thể cùng tồn tại trong cùng một hệ thống,

Và cuối cùng, tên libc-2.15.so đề cập đến bản phát hành libc, khi bạn cài đặt gói libc mới, tên sẽ thay đổi thành libc-2.16.so. Với điều kiện là nó tương thích với phiên bản trước, liên kết libc.so.6 sẽ vẫn được đặt tên theo cách đó và các tệp thi hành hiện có sẽ tiếp tục hoạt động.

+0

Cảm ơn bạn rất nhiều. Điều này đã giúp tôi rất nhiều để hiểu tại sao. – Alejandro

+0

Tại sao họ cũng đặt tên cho tập lệnh liên kết bằng '.so'? Điều đó thật khó hiểu. –

2

Để tìm cái nào để sử dụng, trước tiên bạn phải tìm theo thứ tự mà ld (linker) sử dụng để tìm các thư viện, như vậy:

ld --verbose | grep SEARCH 

Đối với tôi nó đã cho tôi kết quả này:

SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64"); SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib"); 

này có nghĩa là trên máy tính của tôi, ld trông trong các thư mục, theo thứ tự:

  1. /usr/x86_64 -unknown-linux-gnu/lib64
  2. /usr/x86_64-biết-linux-gnu/lib
  3. /usr/lib
  4. /usr/local/lib

Vì vậy, nếu libc là trong/usr/x86_64-unknown-linux-gnu/lib64 và libc cũng nằm trong/usr/lib, nó sẽ sử dụng phiên bản/usr/x86_64-unknown-linux-gnu/lib64, vì nó được liệt kê trước.

+0

Rất thú vị và hữu ích. Cảm ơn bạn. Trong trường hợp của tôi nó liệt kê "/ lib/x86_64-linux-gnu" đầu tiên vì vậy tôi tốt để biên dịch mã 64 bit. Bây giờ, tôi muốn hiểu điều này một cách đầy đủ. Tại sao bản phân phối Linux của tôi đã cài đặt thư viện này ở một số vị trí khác nhau? – Alejandro

+0

@Alejandro, không sao cả! Nếu nó được giải quyết, bạn có thể đánh dấu nó như vậy không? – MiJyn

+0

Xin lỗi, nhưng tôi vẫn muốn biết lý do tại sao có nhiều địa điểm? các tệp này có được sao chép giống nhau không? có thể có một lý do cho điều này tôi đoán. Tôi sẽ đánh dấu nó là đã được giải quyết khi tôi nhận được những câu trả lời này. Cám ơn bạn một lần nữa! – Alejandro

0

Liên kết tượng trưng bạn đã tạo sẽ không có hiệu lực gì trên GCC. Phiên bản 32 bit chỉ được sử dụng khi bạn biên dịch bằng cờ GCC -m32. GCC sẽ không cố gắng để tạo ra mã nhị phân 32-bit trừ khi bạn cho nó (bằng cách sử dụng lá cờ đó.)

+1

Cảm ơn bạn, rất rõ ràng về điểm nếu gcc sẽ biên dịch mã 64 bit theo mặc định. – Alejandro

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