2011-08-18 22 views
9

Tôi đang xem xét diễn giải bảng ký hiệu động (.dynsym) của tệp thi hành ELF. Tôi có thể giải thích thành công bảng biểu tượng .symtab (16 byte cho mỗi biểu tượng) sử dụng thuộc tính 'giá trị' để biểu thị địa chỉ của biểu tượng và thuộc tính 'tên' để biểu thị độ lệch của chuỗi bắt đầu trong .strtab phần. Nhưng tôi không thể diễn giải bảng ký hiệu động (.dynsym) bằng cách sử dụng cùng một phương thức. Tôi đã sử dụng blog của Ali [1] để tham khảo.Làm cách nào để diễn giải bảng ký hiệu động trong một tệp thực thi ELF?

Tôi đã xem một blog khác của Ali [2] nhưng tôi không hiểu cách diễn giải bảng ký hiệu động bằng bảng băm. Rõ ràng nó không phải là ánh xạ giống như được sử dụng bởi bảng biểu tượng. Tôi nên giải thích bảng biểu tượng động (.dynsym) như thế nào?

Ngoài ra, các ELF thực thi mà tôi đang nhìn vào có hai phần, cụ thể là .hash.gnu.hash. Tôi tham chiếu phần nào cho giá trị băm?

[1] http://blogs.oracle.com/ali/entry/inside_elf_symbol_tables
[2] http://blogs.oracle.com/ali/entry/gnu_hash_elf_sections

Cảm ơn và Kính trọng,
Hrishikesh Murali

+0

Được rồi, tôi đã chờ một ngày để nhận xét/trả lời nhưng tôi chưa nhận được bất kỳ câu trả lời nào. Tôi phải kết luận điều gì?: -/ –

Trả lời

2

Nhưng tôi không thể giải thích các bảng biểu tượng động (.dynsym) sử dụng sự cùng một phương pháp.

Bạn cần phải tìm chuỗi trong phần ".dynstr".

Ngoài ra, tệp thực thi ELF mà tôi đang xem có hai phần, cụ thể là .hash và .gnu.hash. Tôi tham chiếu phần nào cho giá trị băm ?

Nó sẽ tùy thuộc vào loại biểu tượng bạn muốn tìm kiếm. Từ những gì tôi biết, Bảng băm kiểu GNU chỉ chứa thông tin có liên quan đến liên kết động.

Xem thêm: Jakub Jelinek's description of GNU hash tables, được đăng trên GNU binutils mailing list.

3

Từ đặc điểm kỹ thuật ELF, mỗi ký hiệu được định nghĩa bằng cách sử dụng cấu trúc sau:

typedef struct { 
     Elf32_Word 
     Elf32_Addr 
     Elf32_Word 
     unsigned char 
     unsigned char 
     Elf32_Half 
} Elf32_Sym; 

Vì vậy, nói chung đây sẽ là 16 byte. Bảng ký hiệu động và tĩnh sử dụng cùng một cấu trúc, do đó việc phân tích cú pháp bảng này chỉ giống nhau cho tĩnh và liên kết. Tất nhiên ý nghĩa của các giá trị không phải lúc nào cũng giống nhau.

Bạn có thể tiếp cận một biểu tượng trong bảng biểu tượng theo hai cách. Đầu tiên, nếu bạn đã biết chỉ mục biểu tượng, bạn chỉ có thể đi đến chỉ mục đó. Nhưng một số lần bạn không có chỉ số biểu tượng, bạn chỉ có một tên biểu tượng và trên thực tế bạn muốn kiểm tra xem bảng biểu tượng có định nghĩa cho một biểu tượng có tên đó không. Trong tình huống thứ hai này, bạn sử dụng các phần băm. Chúng được sử dụng để kiểm tra nhanh nếu một biểu tượng có mặt trong một bảng biểu tượng: tên biểu tượng -> hash -> symb_index -> kiểm tra xem symbol_table [symb_index] == symbol-name.

+0

Điều này không đúng, vì * Elf32_Half * là 2 byte, không phải 4, cho: 4 + 4 + 4 + 1 + 1 + 2 = 16 byte. Ngoài ra, có thể đáng chú ý là với * ELFCLASS64 * (x86-64), đây là 24 byte. – krb686

+0

Tôi tin rằng bạn là đúng. Tôi sẽ sửa. – JohnTortugo

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