Tôi hiện đang làm việc trên một dự án mà tôi cần theo dõi việc sử dụng một số cuộc gọi hệ thống và chức năng cấp thấp như mmap
, brk
, sbrk
. Cho đến nay, tôi đã làm điều này bằng cách sử dụng hàm interposition: Tôi viết một hàm wrapper có cùng tên với hàm tôi đang thay thế (ví dụ: mmap
) và tôi tải nó trong một chương trình bằng cách đặt biến môi trường LD_PRELOAD
. Tôi gọi hàm thực thông qua một con trỏ mà tôi tải với dlsym
.Chức năng interposition trong Linux mà không cần dlsym
Thật không may, một trong các chức năng tôi muốn bọc, sbrk
, được sử dụng nội bộ dlsym
, do đó chương trình bị treo khi tôi cố gắng tải biểu tượng. sbrk
không phải là cuộc gọi hệ thống trong Linux, vì vậy tôi không thể đơn giản sử dụng syscall
để gọi gián tiếp.
Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể gọi chức năng thư viện từ hàm bao bọc có cùng tên mà không cần sử dụng dlsym
? Có bất kỳ thủ thuật biên dịch (bằng cách sử dụng gcc) cho phép tôi tham khảo các chức năng ban đầu?
Điều này thật tuyệt. Tôi đã không bao giờ nghe nói về tùy chọn - wrap, nhưng điều này là chính xác những gì tôi cần. Cảm ơn bạn. –
Để làm rõ, làm các cờ --wrap cần phải được thông qua khi liên kết thực thi hoặc khi liên kết thư viện LD_PRELOAD chứa các trình bao bọc? Ngoài ra, bạn có cân nhắc cung cấp thêm thông tin về việc sửa đổi các mục PLT của tệp thi hành không? –
Trường hợp sử dụng được thiết kế dành cho bạn để liên kết ứng dụng * target * với --wrap. Nó có thể có thể làm cho nó làm việc cho trường hợp LD_PRELOAD là tốt, tôi không chắc chắn, tôi sẽ phải kiểm tra. –