2012-01-26 38 views
5

thể trùng lặp:
dlopen from memory?tải .so tập tin từ bộ nhớ

Tôi đã thấy điều này cho các tập tin DLL của Windows, được nạp từ một bộ nhớ đệm, nhưng tôi không thể tìm thấy nó bất cứ nơi nào cho Linux và mã nguồn "ld" là mã phức tạp nhất mà tôi từng thấy. Vì vậy:

Có ví dụ nào về tải tệp .so từ bộ nhớ không? Ngay cả một cái đơn giản mà tôi có thể hoàn thành? Tôi chỉ không biết bắt đầu từ đâu, mặc dù tôi đã đọc hầu hết các chi tiết kỹ thuật của ELF nhưng nó vẫn còn bí ẩn đối với tôi.

+0

.so được gửi qua kết nối ổ cắm và tìm kiếm người bạn đời giải pháp chứ không phải thay thế. – killercode

+0

@killercode bạn đang tìm kiếm giải pháp cho một vấn đề mà bạn đã xác định khá hẹp. Bạn hiện đang thiếu kiến ​​thức để viết mã .so từ bộ nhớ, và muốn trả tiền cho người khác để làm điều đó. Các lựa chọn thay thế có ý nghĩa hơn, trừ khi bạn có thể cho chúng tôi một số ngữ cảnh. –

+0

.so đang được gửi qua ổ cắm, tôi không muốn ghi nó vào đĩa vì ứng dụng của tôi có thể không có đặc quyền để ghi tệp vào đĩa, vì vậy tôi muốn chạy nó từ bộ nhớ để tránh bất kỳ trên nền tảng nào chỉ là Linux. – killercode

Trả lời

8

Bạn đang xem mã nguồn của một điều sai: ld không tải chương trình và thư viện. Thay vào đó, bạn nên xem mã nguồn của các hàm dlopendlsym có trong libc. Ngoài ra, bạn nên xem mã nguồn của liên kết động: ld-linux.so (tên thật thay đổi theo nền tảng; thực thi ldd /bin/ls để tìm hiểu nơi liên kết động nằm).

Phân tích ELF không khó, nhưng nó đòi hỏi sự chú ý đến từng chi tiết và sự hiểu biết về mã lắp ráp cho CPU cụ thể; bạn cũng cần đặc tả ABI cho nền tảng của mình (và nó khác với Linux 32- và 64-bit, và cũng khác nhau giữa các CPU.)

Nếu bạn chỉ cần tải các tệp đối tượng từ bộ nhớ tại thời gian chạy (tức là, nó không phải là SO), bạn có thể xem xét dự án X11: họ đã triển khai một hệ thống mô-đun, về cơ bản, tải mã đối tượng tại một số địa chỉ và định vị lại nó.

+0

Xem thêm 'readelf'. – cha0site

-1

Bạn cần dlopen() họ của các hàm (trên GNU/Linux, chúng được định nghĩa trong /usr/include/dlfcn.h).

Ví dụ, hãy xem how PHP does modules.

+0

tôi biết cách sử dụng .so từ đĩa, tôi muốn sử dụng chúng từ bộ nhớ, chúng sẽ không tồn tại trên đĩa – killercode

0

"Tải .so tệp từ bộ nhớ" có ý nghĩa gì đối với bạn?

Nếu bạn có bất kỳ *.sotệp, thì nó nằm trong một số hệ thống tệp và có đường dẫn. Sau đó, chỉ cần sử dụng dlopen trên đó.

Nếu nó không phải là tệp, nó là gì? Làm thế nào bạn có được trong bộ nhớ? Chính xác những gì bạn có trong bộ nhớ? (Bạn có tiêu đề ELF và bố cục ELF trong bộ nhớ không?)

Nếu bạn có đủ thông tin để tạo tệp ELF *.so, hãy đổ (ví dụ ghi) tệp đó vào một số hệ thống tệp (sử dụng hệ thống tệp tạm thời như tmpfs nếu bạn có liên quan đến hiệu suất đĩa). Sau đó, dlopen đó.

Nếu bạn không có đủ thông tin để tạo tệp ELF .so, thì có thể bạn đang tạo mã động trong bộ nhớ. Xem xét cơ sở hạ tầng tạo mã máy hiện tại (như LLVM, GCCJIT, libjit, GNU lightning, LuaJit ....) đang thực hiện.

Nếu bạn có mã đầy đủ chức năng trong bộ nhớ, hãy đảm bảo rằng bộ nhớ có thể thực thi với mmap & mprotect và chuyển vào nó (ví dụ:sử dụng các thủ thuật con trỏ hàm).

+0

Tôi khá ngạc nhiên bởi phản hồi tiêu cực. Tôi đã nói gì sai? Tại sao câu trả lời của tôi không liên quan? –

+0

Không chính xác trả lời những gì anh ta dường như đang cố gắng (cứng đầu) đạt được cách anh ta muốn, nhưng thông tin này thường hữu ích. +1 –

+0

Tôi không hiểu chính xác áp phích gốc có nghĩa là gì bằng cách "tải tệp' .so' từ bộ nhớ "... (hoặc thậm chí tải bất kỳ loại tệp nào từ bộ nhớ), vì tệp chỉ có thể đọc từ hệ thống tập tin. Tôi đoán rằng Windows có một chức năng như vậy bởi vì (IIRC) trên windows một số tiến trình không thể hoạt động trên một tập tin cùng một lúc (ví dụ, bạn không thể xóa một tập tin được mở bởi một tiến trình khác trên Windows, nhưng bạn có thể làm điều đó trên Linux) . –

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