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ì?
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. –