2013-08-20 25 views
9

Tôi có thể tải thư viện từ luồng bộ nhớ không? Ví dụ: thư viện của tôi được mã hóa một tệp. Tôi kiểm tra một số điều kiện và giải mã tệp vào luồng bộ nhớ. Bây giờ tôi cần tải thư viện đã giải mã từ luồng đó vào ứng dụng của tôi và sử dụng các chức năng của nó vv.Tôi có thể tải thư viện từ luồng bộ nhớ không?

+1

Tìm thấy điều này cho OSX: http://stackoverflow.com/questions/11821955/load-dynamic-library-from-memory và điều này cho các cửa sổ: http://stackoverflow.com/questions/638277/loading-dll- from-a-location-in-memory – koopajah

+0

Tôi cần giải pháp cho Windows và Linux. –

Trả lời

4

Trong cửa sổ, DLL chỉ có thể được tải từ một tệp - như các liên kết được đề xuất, bạn có thể tạo đĩa RAM và cài đặt như một ổ đĩa, nhưng không có cách nào xung quanh DLL cần phải được tải thông qua một tập tin tồn tại trong một hệ thống tập tin. Một phần của lý do cho điều này là DLL là "nhu cầu nạp", đó là hệ thống không tải toàn bộ tập tin vào bộ nhớ cùng một lúc, nó tải các bộ phận đang thực sự được sử dụng, 4KB (thường) tại một thời điểm. Nó cũng không được trao đổi với vùng trao đổi, nó chỉ bị loại bỏ và nạp lại từ DLL nếu hệ thống đang thiếu bộ nhớ.

Linux hoạt động theo cách tương tự (tôi biết nó sử dụng cùng một loại yêu cầu tải theo mặc định, nhưng không chắc chắn nếu có cách nào đó), vì vậy tôi không tin có cách nào khác một trong hai, nhưng tôi đã không nhìn sâu vào nó. Tất nhiên, nếu tất cả những gì bạn muốn là một đoạn mã mà bạn có thể sử dụng trong ứng dụng của mình, và bạn muốn lưu trữ nó dưới dạng mã hóa/nén/bất cứ thứ gì trong tập tin có giá trị, bạn có thể phân bổ một số bộ nhớ thực thi (trong Windows, bạn có thể sử dụng VirtualAlloc để cấp phát bộ nhớ thực thi). Tuy nhiên, bạn cần đảm bảo rằng bạn di chuyển bất kỳ địa chỉ bộ nhớ tuyệt đối nào trong mã của bạn nếu bạn làm như vậy, vì vậy bạn sẽ cần phải lưu trữ thông tin di chuyển trong tệp thực thi của bạn.

Rõ ràng, giải pháp dễ dàng là giải nén nội dung của bạn thành một tệp trong hệ thống tệp và tải từ đó.

+0

Xem https://github.com/fancycode/MemoryModule để có giải pháp tốt hơn đáng kể so với ramdisk (nếu có giải pháp "tốt" hoặc "tốt hơn", tôi không nghĩ rằng nên thử ngay từ đầu). – Damon

+0

@ Damon: Đó là làm những gì tôi mô tả trong đoạn thứ ba, từ những gì tôi có thể nói (tôi đã không có thông qua TẤT CẢ các mã chi tiết). –

+0

@MatsPeterson: Vâng, đó chính xác là những gì nó làm. Đó là một thực hiện làm việc (tôi đã thử nó một vài năm trước đây) và tốt hơn một chút so với phương pháp "ramdisk" cho những gì OP muốn (vì bạn chỉ có thể đọc các tập tin không được mã hóa từ đĩa RAM anyway). Mặc dù tất nhiên, tôi vẫn không nghĩ rằng nó là một ý tưởng tốt để giả mạo với những thứ đó để bắt đầu, vì nó nghiêm trọng can thiệp vào quản lý VM và nó phần nào mâu thuẫn với khái niệm của một thư viện được chia sẻ, quá. Điểm có DLL là tập tin dựa trên là bạn có thể bản đồ các trang tương tự cho một số quy trình, ném chúng đi, và tải lại theo yêu cầu. – Damon

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