20

Có cách nào để gọi hàm trong hạt nhân Linux không? Tôi biết __ func __ trả về tên hàm đang thực thi. Tôi đang tìm kiếm các chức năng mà được gọi là "__ func __"Người gọi chức năng trong hạt nhân Linux

+2

Muahahahaaa. Haha ... không an toàn. –

Trả lời

37

Bạn có thể lấy người gọi với __builtin_return_address(0).

Người gọi của người gọi là __builtin_return_address(1) và cứ tiếp tục như vậy.

Đó là một phần mở rộng GCC, tài liệu trong cuốn hướng dẫn gcc: http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html

Edit: tôi có lẽ nên chỉ ra, đem đến cho bạn địa chỉ của người gọi. Nếu bạn muốn tên hàm bạn có thể in nó với %pS, ví dụ:

printk("Caller is %pS\n", __builtin_return_address(0)); 

Nếu bạn không muốn in nó, bạn có thể sử dụng kallsyms_lookup(), vv

+8

Đó là một số jujitsu ấn tượng. –

+0

Bạn có cần kích hoạt con trỏ khung để sử dụng không? – Brad

+0

Có thể bạn cần có con trỏ khung. – mpe

4

hay không khung gợi ý là cần thiết phụ thuộc trên vòm, IIRC. Đối với x86, họ chắc chắn muốn khai thác triệt để các tính năng này. Cũng lưu ý rằng nội tuyến có thể nghiêng chính xác của buildin_return_address vì lý do này.

Nếu bạn chỉ muốn một bãi chứa ngăn xếp để xem một số địa điểm đã đạt được như thế nào, hãy sử dụng hàm dump_stack() tốt hơn là cố gắng tìm hiểu thêm với builtin_return_address.

5

Bạn cũng có thể in toàn bộ nội dung ngăn xếp cuộc gọi bằng cách gọi dump_stack().

0

Để lấy tên hàm người gọi, người ta có thể sử dụng lệnh printk dưới đây.

printk ("Người gọi là% pF \ n", __builtin_return_address (0));

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