Vấn Đề Gỡ Bỏ Libstdc++ - nói dối e blog

Vấn Đề Gỡ Bỏ Libstdc++

Ngày hôm nay, đồng nghiệp của tôi đã dành cả buổi chiều để truy tìm nguyên nhân chính xác của sự cố tôi gặp phải vào cuối tuần trước.

Nguyên nhân bắt nguồn từ việc thư viện GLU được viết bằng C++, dẫn đến việc libstdc++.so (thư viện chuẩn C++) bị gỡ bỏ theo. Đặc biệt, phiên bản libstdc++.so này chứa một lỗi ẩn, khiến ứng dụng gặp sự cố nghiêm trọng. Điều đáng chú ý là lỗi này chỉ bộc lộ khi chương trình hoàn toàn được viết bằng C và không sử dụng bất kỳ thành phần nào của libstdc++.

Các bạn quan tâm có thể tham khảo bài viết chi tiết tại: . Tài liệu này phân tích rằng:

Trong thư viện thời gian chạy của C (crtbeginS.o), tồn tại một ký hiệu yếu mang tên __deregister_frame_info. Khi libstdc++.so được tải vào bộ nhớ, ký hiệu này bị ràng buộc (relocate) sang đoạn mã của thư viện này. Tuy nhiên, trong quá trình kết thúc chương trình, libstdc++.so đã bị gỡ bỏ trước khi gọi đến hàm này, khiến tiến trình truy cập vào một không gian địa chỉ không tồn tại.

Vấn đề này được ghi nhận phổ biến trên phiên bản libstdc++.so.5. Khi thử nghiệm trên phiên bản libstdc++.so.6, lỗi không còn xuất hiện, cho thấy lỗi đã được khắc phục ở các phiên bản mới hơn.

Bài học rút ra:

  • Cẩn trọng khi gỡ bỏ các thư viện hệ thống, đặc biệt là libstdc++.
  • Luôn kiểm tra tương thích phiên bản thư viện với mã nguồn đang sử dụng.
  • Với ứng dụng thuần C, nên tìm cách loại bỏ mọi phụ thuộc tiềm ẩn vào thư viện C++.
0%