8

Có ai biết tại sao thư viện được khởi tạo trong dlopen() sẽ khởi tạo biến tĩnh do chương trình chính sở hữu hay không. Cả hai chương trình chính và thư viện chia sẻ đều có một bản sao của biến tĩnh, nhưng vì một lý do nào đó thư viện chia sẻ lại khởi tạo bản sao của biến chính của chương trình chính và phá hủy nó, gây ra một segfault khi chương trình chính cố gắng hủy nó.Chương trình chính và Thư viện được chia sẻ khởi tạo cùng một biến tĩnh trong __static_initialization_and_destruction_0

Đây có phải là trường hợp mang tên xấu trong bảng biểu tượng không?

Trả lời

7

Đây là trường hợp mà trình liên kết thời gian chạy chỉ muốn một bản sao hoạt động duy nhất của một biểu tượng trong một quy trình. Nếu cả một đối tượng được chia sẻ và tệp thực thi đều có một bản sao của biểu tượng, trình liên kết thời gian chạy sẽ giải quyết tất cả các tham chiếu đến một trong các đối tượng đó.

Việc bạn có thể làm để giải quyết vấn đề này là sử dụng giảm ký hiệu bằng cách sử dụng version command của trình chỉnh sửa liên kết khi xây dựng đối tượng được chia sẻ. Hãy chắc chắn rằng biểu tượng cho biến tĩnh không phải là toàn cục và bạn sẽ nhận được hành vi mà bạn đang tìm kiếm.

+0

Hrm, có vẻ như tôi gặp sự cố khi triển khai tập lệnh phiên bản và chuyển nó tới trình liên kết. Nó đang phàn nàn về một lỗi cú pháp. Đây là tập lệnh mà tôi đã sử dụng: "{global: local: *;}" Mọi ý tưởng? Tôi đã tìm các ví dụ nhưng tất cả dường như không kiểm tra cú pháp. Hay tốt hơn là đưa chỉ thị __asm__ trực tiếp vào nguồn? – Paul

+0

@Paul - tập lệnh của tôi trông giống như 'VERSION {{global: ...; địa phương *; }; } 'và sau đó tôi chỉ sử dụng tên tệp của tệp đó trên dòng lệnh của trình liên kết. –

+0

@Samuel - Cảm ơn một nhóm, sau khi hoàn thành tập lệnh phiên bản và thêm một vài biểu tượng vào bối cảnh toàn cục, nó hiện hoạt động! – Paul