GLIBCXX 3.4.15 trên Centos 6


8

Tôi cần cài đặt GLIBCXX 3.4.15 trên phiên bản Centos 6 của mình (để chạy máy chủ cho trò chơi trên Steam). Tôi đã đi vòng quanh và có một số trang web nơi họ cài đặt các chương trình có lỗi xuất hiện trong đó nói rằng cần có 3.4.15 ( LoadLibrary ERROR: /usr/lib/libstdc++.so.6: version 'GLIBCXX_3.4.15' not found), nhưng họ chỉ sử dụng một cách để bỏ qua / không cài đặt nó. Khi tôi đã làm strings /usr/lib/libstdc++.so.6 | grep GLIBCXX, đây là đầu ra:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

Vậy, làm cách nào để cài đặt trực tiếp GLIBCXX 3.4.15 trên Centos 6?

Câu trả lời:


7

Tôi sẽ coi đây là một vụ hack nhưng đã sử dụng nó trong nhiều trường hợp hơn là tôi thừa nhận để giải quyết các vấn đề tương thích với GLIBC, chẳng hạn như sự cố mà bạn gặp phải.

Việc hack bao gồm tạo một liên kết trong /usr/libđó bao gồm tên của thư viện mà một công cụ cụ thể muốn. Liên kết sau đó trỏ đến tên thay thế của thư viện.

Thí dụ

Nói rằng tôi muốn tạo một liên kết đến libstdc++.so.6.

$ ls -l /usr/lib | grep libstdc++.so
lrwxrwxrwx.  1 root root       19 Dec 18  2010 libstdc++.so.6 -> libstdc++.so.6.0.14
-rwxr-xr-x   1 root root   950428 Sep 24  2010 libstdc++.so.6.0.14

Nó hoạt động giống như thế này:

$ ln -s libstdc++.so.6 libstdc++.so.6.0.15

Kiểm tra kết quả:

$ ls -l /usr/lib | grep libstdc++.so
lrwxrwxrwx.  1 root root       19 Dec 18  2010 libstdc++.so.6 -> libstdc++.so.6.0.14
lrwxrwxrwx.  1 root root       19 Dec 18  2010 libstdc++.so.6.0.15 -> libstdc++.so.6.0.14
-rwxr-xr-x   1 root root   950428 Sep 24  2010 libstdc++.so.6.0.14

Nhưng tôi không chắc phương pháp này sẽ hoạt động vì thư viện của bạn vẫn sẽ thiếu chuỗi phiên bản , GLIBCXX_3.4.15.

Nếu việc hack không thành công thì có khả năng bạn sẽ phải cắn viên đạn và cài đặt GLIBC trong một thư mục thay thế, sau đó ghi đè lên LD_LIBRARY_PATHhoặc LD_PRELOADđể việc thực thi chỉ hơi nước nhìn thấy thư viện đã sửa đổi.

Thí dụ

$ LD_PRELOAD='mylibc.so anotherlib.so' program

Chi tiết về cách thực hiện việc này được đề cập thêm một chút ở đây trong Hỏi & Đáp SO này: Nhiều thư viện glibc trên một máy chủ .


@PMint - phương pháp nào hiệu quả với bạn?
slm

Không nên là dòng thứ hai ls, thứ ba libstdc++.so.6.0.15 -> libstdc++.so.6.0.14?
Runium

@Sukminder - vâng, cảm ơn vì đã bắt được. Đã sửa.
slm

2

Về cơ bản, phiên bản của gói libstdc ++ RPM do CentOS (4.4.7) cung cấp không đủ gần đây cho ứng dụng của bạn. CentOS cung cấp sự ổn định lâu dài thay vì các phiên bản mới nhất và lớn nhất, vì vậy điều đó không hoàn toàn bất ngờ.

Fedora thường đi trước một chút và có thể chạy máy chủ của bạn mà không gặp vấn đề gì.

Ngoài ra, bạn có thể xây dựng một phiên bản libstdc ++ mới hơn từ một nguồn mới hơn. Tôi sẽ bắt đầu tập tin CentOS SPEC trong gcc SRPM, bản phát hành mới nhất từ ​​gcc.gnu.org và làm lại những thứ đó để xây dựng RPM của riêng tôi.

Nâng cấp các thư viện C trước đây là một cách tốt để phá vỡ một hệ thống theo những cách không ngờ tới ...


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.