2010-04-22 39 views
13

Ví dụ:Trả về một thư viện chia sẻ biểu tượng bảng

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY); 
void* initializer = dlsym(sdl_library,"SDL_Init"); 

Giả sử không có lỗi, khởi tạo sẽ trỏ tới hàm SD_Init trong thư viện chia sẻ libSDK.so.

Tuy nhiên, điều này đòi hỏi phải biết biểu tượng "SDL_Init" tồn tại.

Có thể truy vấn thư viện cho tất cả các ký hiệu của nó không? Ví dụ, trong trường hợp này nó sẽ trả về SDL_Init, con trỏ hàm và bất kỳ biểu tượng nào khác được xuất bởi libSDL.so.

Trả lời

14

Không có chức năng libc để làm điều đó. Tuy nhiên, bạn có thể viết một bản thân (mặc dù mã có phần liên quan).

Trên Linux, dlopen() trên thực tế trả về địa chỉ của một cấu trúc link_map, trong đó có một thành viên mang tên l_addr trỏ đến địa chỉ cơ sở của đối tượng chia sẻ tải (giả sử hệ thống của bạn không ngẫu nhiên chia sẻ vị trí thư viện, và địa chỉ thư viện chưa được prelinked).

Trên Linux, một cách chắc chắn để tìm địa chỉ cơ sở (địa chỉ Elf*_Ehdr) là sử dụng dl_iterate_phdr() sau khi dlopen() nhập thư viện.

Có tiêu đề ELF, bạn sẽ có thể để lặp qua một danh sách các biểu tượng xuất khẩu (bảng ký hiệu động), bằng cách đầu tiên định vị Elf*_Phdr loại PT_DYNAMIC, và sau đó định vị DT_SYMTAB, DT_STRTAB mục, và lặp lại khắp những biểu tượng trong bảng ký hiệu động. Sử dụng /usr/include/elf.h để hướng dẫn bạn.

Ngoài ra, bạn có thể sử dụng libelf, nhưng tôi không thể hướng dẫn bạn vì tôi không có kinh nghiệm trước đó. Cuối cùng lưu ý rằng bài tập có phần vô ích: bạn sẽ nhận được một danh sách các hàm được định nghĩa, nhưng bạn sẽ không biết cách gọi chúng (các thông số nào mà chúng mong đợi), vậy điểm là gì?

-2
void *dlsym(void *restrict handle, const char *restrict name); 

Return Value

Nếu xử lý không đề cập đến một đối tượng hợp lệ mở bởi dlopen(), hoặc nếu tên biểu tượng không thể được tìm thấy trong bất kỳ các đối tượng được liên kết với xử lý, dlsym() sẽ trả về VÔ GIÁ TRỊ. Thông tin chẩn đoán chi tiết hơn sẽ có sẵn thông qua dlerror().

(Nguồn: http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html)

Nói cách khác, nếu các biểu tượng không được tìm thấy, dlsym() sẽ trở lại NULL. Không chắc đó có phải là điều bạn đang tìm kiếm hay không, nhưng đó là cách đơn giản nhất tôi có thể tìm thấy.

+1

Nghe có vẻ với tôi như OP là tìm cách để có được một danh sách các biểu tượng xuất khẩu từ thư viện. Mà tôi không nghĩ là có thể mà không làm một số phân tích các phần trong cấu trúc ELF. –

-2

Các linux nm lệnh có thể được sử dụng: http://man.yolinux.com/cgi-bin/man2html?cgi_command=nm

+0

Câu hỏi dường như đang tìm kiếm một phương tiện lập trình truy vấn bảng biểu tượng của một thư viện được chia sẻ. 'nm' là một tiện ích dòng lệnh có định dạng đầu ra văn bản thay đổi theo nền tảng. –

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