2010-07-15 21 views
6

Tôi hy vọng sẽ LoadLibrary trên một DLL không được quản lý C + + với mã được quản lý, và sau đó gọi GetProcAddress trên các chức năng bên ngoài đã bị xáo trộn. Câu hỏi của tôi là các tên bị xáo trộn mà bạn nhận được từ một trình biên dịch C++ xác định? Đó là: Liệu tên luôn luôn được chuyển đổi sang cùng một tên bị xâu xé, nếu chữ ký gốc không thay đổi?Có phải tên C++ mangling (trang trí) xác định?

+0

thể trùng lặp của [tên mangling là gì, và làm thế nào nó hoạt động?] (Http://stackoverflow.com/questions/1314743/what-is-name-mangling- and-how-does-it-work) –

+1

Khi trình biên dịch quay phiên bản nó có thể thay đổi cách nó mang tên mangling. Vì vậy, miễn là bạn gắn bó với một trình biên dịch cụ thể và một phiên bản cụ thể, bạn nên được OK. Lưu ý một số trình biên dịch cung cấp trong đó có thời gian chạy một API cho phép bạn chuyển đổi thành <--> từ tên bị xáo trộn. Bạn có thể xem C++ filt hoạt động như thế nào để tìm hiểu về các thư viện mang gcc. –

+0

@Martin. Đó là thông tin tuyệt vời. Tôi bị giới hạn trong các nền tảng Windows. Điều này cho tôi biết rằng tôi cần phải chuẩn bị cho việc phá vỡ những thay đổi hoặc tìm cách khác. – Blanthor

Trả lời

6

Nó không được chỉ định theo tiêu chuẩn, và chắc chắn đã thay đổi giữa các phiên bản của cùng một trình biên dịch trong kinh nghiệm của tôi, mặc dù nó phải xác định qua một số trường hợp cố định, vì nếu không sẽ không có cách nào để liên kết hai mô-đun được biên dịch riêng biệt.

Nếu bạn đang sử dụng GetProcAddress, sẽ dễ dàng hơn để xuất các chức năng dưới dạng extern "C" để tên của chúng không bị xáo trộn.

+4

Một phiên bản cụ thể của trình biên dịch sẽ mangle tên một cách nhất quán, nếu không nó sẽ không thể liên kết với những thứ được tạo ra. Ngoài ra, tất cả các cược đều bị tắt. – Eltariel

0

Tên mangeling được xử lý khác nhau bởi mọi trình biên dịch (có thể hoặc không có không có tiêu chuẩn). Nếu bạn sử dụng các hàm C thuần túy trong mã C++ của mình, bạn có thể sử dụng "C" bên ngoài để chặn tên mangeling cho các hàm C để trình biên dịch có thể tìm thấy chúng.

2

Đó là trình biên dịch cụ thể, như những người khác đã nói. Tuy nhiên, bạn có thể tìm thấy chi tiết trong tài liệu bằng Agner Sương mù ...

http://www.agner.org/optimize/#manuals

Xem mục 5 trên trang đó.

Ngoài ra, những ngày này, có những thư viện có thể xử lý xâu chuỗi và xử lý các trình biên dịch thông thường cho bạn. Đối với Visual C++, điểm khởi đầu sẽ là các thư viện dbghelp và imagehlp.

http://msdn.microsoft.com/en-us/library/ms679292%28v=VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms680321%28v=VS.85%29.aspx

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