Những phần nào của tệp thực thi ELF được tải vào bộ nhớ và ở đâu?


10

Những gì tôi đã biết:

Một tệp thực thi ELF có một số phần, rõ ràng là các phần .text và .data được tải vào bộ nhớ vì đây là các phần chính của chương trình. Nhưng để một chương trình hoạt động, nó cần thêm thông tin, đặc biệt là khi được liên kết động.

Điều tôi quan tâm là các phần như .plt, .got, .dynamic, .dynsym, .dynstr vân vân. Các bộ phận của ELF chịu trách nhiệm liên kết các chức năng với các địa chỉ.

Từ những gì tôi có thể tìm ra cho đến nay, đó là những thứ như .symtab và .strtab không được tải (hoặc không ở lại) trong bộ nhớ. Nhưng .dynsym và .dynstr được sử dụng bởi trình liên kết? Họ có ở trong ký ức không? Tôi có thể truy cập chúng từ mã chương trình không?

Và có phần nào của một tệp thực thi nằm trong bộ nhớ kernel không?

Quan tâm của tôi về điều này chủ yếu là pháp y, nhưng bất kỳ thông tin về chủ đề này sẽ giúp. Các tài nguyên tôi đã đọc về các bảng này và liên kết động ở mức cao hơn, chúng chỉ giải thích các hoạt động, không có gì thực tế về nội dung trong bộ nhớ.

Hãy cho tôi biết nếu có bất cứ điều gì không rõ ràng về câu hỏi của tôi.

Câu trả lời:


12

Sau đây là một tài liệu tham khảo thực sự tốt: http://www.ibm.com/developerworks/linux/lvern/l-dynamic-lologists/ . Nó chứa một thư mục ở cuối một loạt các tài liệu tham khảo khác nhau ở các cấp độ khác nhau. Nếu bạn muốn biết mọi thông tin chi tiết, bạn có thể truy cập thẳng vào nguồn: http://www.akkadia.org/drepper/dsohowto.pdf . (Ulrich Drepper đã viết trình liên kết động Linux.)

Bạn có thể có được một cái nhìn tổng quan thực sự tốt về tất cả các phần trong tệp thực thi của mình bằng cách chạy một lệnh như "objdump -h myexe" hoặc "readelf -S myexe".

Phần .interp chứa tên của trình tải động sẽ được sử dụng để liên kết động các ký hiệu trong đối tượng này. Phần .dynamic là phần chưng cất của tiêu đề chương trình được định dạng để dễ dàng cho trình tải động đọc. (Vì vậy, nó có con trỏ đến tất cả các phần khác.)

.Got (Bảng bù đắp toàn cầu) và .plt (Bảng liên kết thủ tục) là hai cấu trúc chính được thao tác bởi trình liên kết động. .Got là bảng chỉ định cho các biến và .plt là bảng chỉ định cho các hàm. Mỗi thư viện thực thi hoặc thư viện (được gọi là "đối tượng chia sẻ") có .got và .plt riêng và đây là các bảng biểu tượng được tham chiếu bởi đối tượng chia sẻ thực sự có trong một số đối tượng chia sẻ khác.

.Dynsyn chứa tất cả thông tin về các ký hiệu trong đối tượng dùng chung của bạn (cả những biểu tượng bạn xác định và các biểu tượng bên ngoài bạn cần tham chiếu.) .Dynsyn không chứa tên biểu tượng thực tế. Chúng được chứa trong .dynstr và .dynsyn có con trỏ vào .dynstr. .gnu.hash là bảng băm được sử dụng để tra cứu nhanh các ký hiệu theo tên. Nó cũng chỉ chứa các con trỏ (con trỏ vào .dynstr và các con trỏ được sử dụng để tạo chuỗi xô.)

Khi đối tượng chia sẻ của bạn hủy kết nối, một số biểu tượng "foo", trình liên kết động phải tìm kiếm "foo" trong tất cả các đối tượng động mà bạn được liên kết để tìm ra cái nào chứa "foo" mà bạn đang tìm kiếm (và sau đó là tương đối địa chỉ của "foo" nằm trong đối tượng được chia sẻ đó.) Trình liên kết động thực hiện điều này bằng cách tìm kiếm phần .gnu.hash của tất cả các đối tượng chia sẻ được liên kết (hoặc phần .hash cho các đối tượng chia sẻ cũ không có .gnu. phần băm.) Một khi nó tìm thấy địa chỉ chính xác trong đối tượng chia sẻ được liên kết, nó đặt nó vào .got hoặc .plt của đối tượng chia sẻ của bạn.


Cảm ơn, các liên kết của bạn đưa tôi thêm một bước nữa trong việc tìm ra các ánh xạ ảo của các phần tôi cần. Vì sự quan tâm của tôi đối với vấn đề này là pháp y, "nạp vào DRAM" vẫn phù hợp với tôi. Nếu một phần được ánh xạ nhưng không bao giờ được tải, tôi sẽ không thể tìm thấy nó trong một bãi chứa bộ nhớ :)
Dutchy

Bạn đúng rồi. Khi bạn thực hiện kết xuất bộ nhớ, bạn sẽ nhận được một bản sao của mỗi trang được ánh xạ để sự khác biệt của tôi giữa "ánh xạ vào vm" và "được tải vào DRAM" là không liên quan. Tôi bỏ câu đó và câu trả lời được cải thiện. Cảm ơn bạn!
Logic lang thang

Đánh dấu câu trả lời của bạn là câu trả lời, bởi vì đó là nhiều thông tin mà tôi sẽ nhận được :) sẽ phải tự mình làm phần còn lại, đó là nghiên cứu của tôi.
Dutchy

Vì vậy, yes .dynsym và .dynstr (và những người khác) được sử dụng bởi trình liên kết động và được tải trong bộ nhớ chương trình (trong đoạn văn bản) và có thể được chương trình của bạn sử dụng trong thời gian chạy.
ysdx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.