Skip to content Skip to main navigation Skip to footer

Xử lý lỗi CXXABI 1.3.9 not found trên CentOS 7 chạy DirectAdmin

Trong bài viết này mình sẽ hướng dẫn các xử lý lỗi CXXABI 1.3.9 not found cũng như cách nâng cấp GCC trên CentOS 7.

1. Tổng quan

Trong quá trình quản trị VPS/Server đôi khi bạn sẽ gặp những yêu cầu từ các bộ phận sử dụng khác như bên dev, khách hàng, đồng nghiệp..vv.. Và hôm nay mình cũng gặp một yêu cầu từ phía dev là trên máy chủ không có CXXABI 1.3.9 nên lỗi argon2, lỗi Bcrypt trên Nodejs, với thông báo lỗi như sau:

AZDIGI Tutorial
ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ......)
    

Vậy là mình quyết định tìm hiểu cách cài đặt và mọi thứ đã hoạt động tốt trên server DirectAdmin.

2. SSH vào hệ thống DirectAdmin của bạn

Để xử lý lỗi CXXABI 1.3.9 not found, đầu tiên chúng ta cần SSH hoặc truy cập VPS hoặc máy chủ của bạn với quyền root trước. Nếu bạn chưa biết cách SSH vào VPS hoặc Server của bạn thì bạn có thể tham khảo bài viết hướng dẫn sau:

Sau khi đã SSH thành công chúng ta tiếp tục với bước tiếp theo để kiểm tra thư viện CXXABI của bạn đang có những phiên bản nào.

3. Kiểm tra các phiên bản CXXABI đã được cài đặt

Để kiểm tra các phiên bản CXXABI đã được cài đặt chúng ta sử dụng lệnh sau:

AZDIGI Tutorial
strings /usr/lib64/libstdc++.so.6 | grep CXXABI
    

Dưới đây là kết quả của mình:

CXXABI 1.3.9 not found

Phiên bản cao nhất CXXABI của mình chỉ là 1.3.7 mà thôi, để có các phiên bản mới các bạn cần phải nâng cấp GCC trên máy chủ của mình. Chúng ta tiếp tục với các bước sau để cài GCC mới hơn giúp CXXABI có thêm các phiên bản mới hơn nhé.

4. Cài đặt GCC từ source

Mặc định máy chủ CentOS 7 phiên bản GCC mới nhất khi cài từ thư viện yum chỉ là bản 4.8.5 mà thôi, một phiên bản rất cũ kỹ được phát hành từ 2015. Để kiểm tra phiên bản GCC bạn có thể sử dụng lệnh gcc --version. Kể cả khi bạn sử dụng lệnh yum -y install gcc gcc-c++ thì bản mới nhất cũng sẽ là 4.8.5.

Để cài đặt được phiên bản GCC cao hơn bạn cần biên dịch từ source. Dưới đây là cách thực hiện điều này.

Bước 1: Tạo một screen trước khi tiến hành cài đặt GCC từ source

Vì quá trình cài đặt mất kha khá thời gian nên bạn cần vào một screen để có thể xem tiếp khi nhỡ mất kết nối SSH. Để tạo một screen chúng ta sử dụng lệnh sau:

AZDIGI Tutorial
screen -U -S gcc
    

Nếu bạn chưa rành sử dụng hoặc cài đặt screen các bạn có thể tham khảo bài viết sau:

Bước 2: Các lệnh cài đặt GCC từ source

Lưu ý: Trước khi thực hiện bước này các bạn nên cd vào phân vùng có dung lượng còn trống hơn 6Gb nhé, vì quá trình biên dịch sẽ tạo ra lượng dữ liệu nặng gần 6Gb đấy.

Quá trình cài đặt từ source có thể mất vài tiếng đồng hồ của bạn vì quá trình biên dịch sẽ khá lâu đấy, và sẽ lâu hơn trên VPS/Server có cấu hình CPU thấp. Dưới đây là các lệnh bạn sẽ cần thực hiện:

AZDIGI Tutorial
wget http://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-7.3.0/gcc-7.3.0.tar.gz
tar zxf gcc-7.3.0.tar.gz
cd gcc-7.3.0
yum -y install bzip2
./contrib/download_prerequisites
./configure --disable-multilib --enable-languages=c,c++
make -j 4
make install
    

Giải thích các lệnh trên:

  • Lệnh 1: Tải mã nguồn GCC phiên bản 7.3.0, các bạn có thể thay thế thành phiên bản khác nếu muốn tại link sau: http://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/
  • Lệnh 2: Giải nén tệp tin gcc-7.3.0.tar.gz vừa mới được tải về.
  • Lệnh 3: Di chuyển vào thư mục vừa mới được giải nén gcc-7.3.0.
  • Lệnh 4: Cài thêm thư viện bzip2 vì trong quá trình biên dịch sẽ cần.
  • Lệnh 5: Chạy tập lệnh ‘download_prerequisites’ để tải xuống một số điều kiện tiên quyết mà GCC cần. Bạn phải chạy lệnh này từ thư mục gốc của thư mục gcc-7.3.0 chứ không phải thư mục con bên trong nó.
  • Lệnh 6: Khi các điều kiện tiên quyết được tải xuống, thực hiện lệnh này để bắt đầu định cấu hình môi trường xây dựng GCC.
  • Lệnh 7: Biên dịch mã nguồn GCC.
  • Lệnh 8: Cài đặt GCC từ source.

Dưới đây là một số hình ảnh trong quá trình cài đặt:

Lệnh 7: Biên dịch mã nguồn GCC.
Lệnh 8: Cài đặt GCC từ source.

Ở lệnh 7 các bạn có thể mất đến vài tiếng đồng hồ nếu máy chủ của bạn có cấu hình thấp. Các bạn có thể ngủ một giấc rồi dậy chứ đừng ngồi đợi 😄

Sau khi đã cài đặt xong chúng ta sử dụng lệnh gcc --version để kiểm tra phiên bản mới vừa được cài đặt. Như ở đây của mình thì đã lên được phiên bản mới.

GCC

Tuy nhiên mọi thứ đến đây vẫn chưa xong vì sử dụng lệnh sau kết quả vẫn chưa có các phiên bản CXXABI mới hơn:

AZDIGI Tutorial
strings /usr/lib64/libstdc++.so.6 | grep CXXABI    

Chúng ta thấy rằng phiên bản cao nhất vẫn chỉ là 1.3.7. Giải thích cho vấn đề này xảy ra bởi vì khi gcc được nâng cấp, thư viện động được tạo không thay thế thư viện động của phiên bản cũ của gcc. Chúng ta tiếp tục với bước cuối cùng để thay thế thư viện động (dynamic library) của gcc.

Bước 3: Thay thế thư viện CXXAB theo phiên bản mới của GCC

Chúng ta sử dụng lệnh sau để kiểm tra thư viện động (dynamic library) của libstdc++ đang có sẵn.

AZDIGI Tutorial
find / -name "libstdc++.so.*"
    

Dưới đây là kết quả của mình:

CXXABI 1.3.9 not found

Ở hình này các bạn có thể thấy phiên bản 6.0.24 của libstdc++ là phiên bản mới được cài vào sau khi cập nhật GCC 7.3 mới.

Chúng ta tiếp tục sử dụng các lệnh sau để thay thế cho phiên bản cũ 6.0.19 hiện tại:

AZDIGI Tutorial
cp /usr/local/lib64/libstdc++.so.6.0.24 /usr/lib64/
rm -rf libstdc++.so.6
ln -s libstdc++.so.6.0.24 libstdc++.so.6
    

Giải thích các lệnh trên:

  • Lệnh 1: Sao chép thư viện libstdc++.so.6.0.24 vào thư mục /usr/lib64/, có thể bên máy chủ của các bạn sẽ khác đường dẫn so với mình nhé. Nên hãy xem kỹ đoạn này.
  • Lệnh 2: Xoá liên kết mềm vào thư viện cũ.
  • Lệnh 3: Liên hệ lại vào thư viện mới.

Như vậy là xong hết các bước. Chúng ta có thể kiểm tra lại kết quả với lệnh cũ:

AZDIGI Tutorial
strings /usr/lib64/libstdc++.so.6 | grep 'CXXABI'
    

Dưới đây là kết quả của mình:

CXXABI 1.3.9 not found

Quá tuyệt vời phải không nào, không những đã khắc phục được thiếu bản CXXABI_1.3.9 mà chúng ta còn có bản mới hơn là CXXABI_1.3.11.

5. Tổng kết

Qua bài viết này chúng ta có thể giải quyết được 2 vấn đề đó là lỗi: CXXABI 1.3.9 not found và nâng cấp GCC lên phiên bản cao hơn khi trong thư viện yum chưa hỗ trợ nâng cấp lên các phiên bản này. Tuy các vấn đề trên này không liên quan gì đến DirectAdmin nhưng vì mình sử dụng DirectAdmin nên cũng đề cập vào thôi. Các bạn hoàn toàn làm được trên các hệ thống CentOS 7 hoặc control panel khác. Hy vọng bài viết này hữu ích với tất cả mọi người.

Nếu thấy bài viết hữu ích đừng quên đánh giá 5 sao.

Chúc các bạn thực hiện thành công.

Xem thêm các bài viết hữu ích về DirectAdmin tại đường dẫn sau:

Nếu các bạn cần hỗ trợ các bạn có thể liên hệ bộ phận hỗ trợ theo các cách bên dưới: