Как найти символ конкретной функции C, если в пользовательском режиме символы не загружены? - PullRequest
1 голос
/ 26 июня 2011

Следующий код упоминается в этом вопросе .

int (*my_printk)(const char *fmt, ...);
my_printk = find_symbol_address("printk");
(*my_printk)("Hello, world!\n");

Как OP находит адрес символа, если среда LSM не экспортирует его символы?Вопрос ОП в режиме ядра;Мне интересно, как это сделать в режиме пользователя.

1 Ответ

2 голосов
/ 26 июня 2011

Ваш связанный вопрос сильно отличается от пользовательского пространства: поскольку ядро ​​поддерживает полную таблицу символов (см. kernel/module.c функция lookup_symbol), не очень сложно отсканировать таблицу и найти определенный символ,найдите его адрес и выполните довольно хакерскую вставку, которую он выполняет.(Я понимаю его рассуждения, но жаль, что он не просто сделал свой источник патчем, который можно было бы применить к ядрам распределения или даже включить в основное ядро ​​дерева. Достаточно справедливо, его код, его время, его игровая площадка, но этоозначает, что он может делать довольно забавные вещи.)

Пользовательский режим немного отличается;если символы недоступны, они просто недоступны.Разработчики ядра приложили некоторые усилия, чтобы подражать случаю «наличия символов», который является обычным в пользовательском пространстве, и если вы strip(1) отредактировали свой код, они пропали.

...