2012-08-06 31 views
5

Có thể tải thư viện từ bộ nhớ thay vì từ hệ thống tập tin trên mac/gcc không?Tải thư viện động từ bộ nhớ

Với cửa sổ tôi đang sử dụng MemoryModule nhưng rõ ràng nó không tương thích với nhiều nền tảng.

+0

có thể trùng lặp của [dlopen từ bộ nhớ?] (Http://stackoverflow.com/questions/5053664/dlopen-from-memory) –

+0

@JonathonReinhart - Không hoàn toàn. Đó là yêu cầu làm thế nào để 'hack' 'dlopen' (* cụ thể *) để tải từ bộ nhớ. Tôi đang tự hỏi về bất kỳ cách nào khác có thể để làm điều đó. – Qix

Trả lời

6

Trước tiên, để thực hiện việc này, tôi khuyên bạn nên đọc số OS X ABI Dynamic Loader Reference.

Để thực hiện việc này, bạn phải sử dụng API NSCreateObjectFileImageFromMemory.

Đưa con trỏ đến tệp Mach-O trong bộ nhớ, hàm này tạo và trả về tham chiếu NSObjectFileImage. Triển khai hiện tại chỉ hoạt động với các gói, vì vậy bạn phải xây dựng tệp thực thi Mach-O bằng tùy chọn liên kết -bundle.

Khối bộ nhớ address điểm đến, phải được cấp phát với vm_allocate (/usr/include/mach/vm_map.h).

Đảm bảo tuân theo yêu cầu vm_allocate được sử dụng cho khối bộ nhớ chứa mô-đun.

Khi bạn có được tệp hình ảnh đối tượng, bạn phải sử dụng hàm NSLinkModule để liên kết mô-đun vào chương trình.

Khi bạn gọi hàm này, tất cả thư viện được tham chiếu bởi mô-đun đã cho sẽ được thêm vào danh sách tìm kiếm thư viện. Trừ khi bạn vượt qua NSLINKMODULE_OPTION_PRIVATE, NSLinkModule sẽ thêm tất cả các biểu tượng toàn cầu trong mô-đun vào danh sách biểu tượng chung.

Sau khi liên kết, đừng quên dọn dẹp bằng cách gọi hàm NSDestroyObjectFileImage.

Khi chức năng này được gọi, nạp năng động gọi vm_deallocate (/usr/include/mach/vm_map.h) trên bộ nhớ được trỏ đến bởi các tham số objectFileImage.

Lưu ý rằng mặc dù các chức năng này không được chấp nhận, không có sự thay thế (theo hiểu biết tốt nhất của tôi) bằng cách sử dụng phương án được đề xuất dlopen et. al.

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