Доступ к символам ядра Linux, которые не экспортируются через EXPORT_SYMBOL * - PullRequest
5 голосов
/ 31 марта 2012

Нам нужен доступ к глобальным переменным ядра в net / ipv4 / af_inet.c, которые явно не экспортируются из загружаемого модуля ядра.В настоящее время мы используем ядро ​​2.6.18.

kallsyms_lookup_name больше не доступно (не экспортируется)

__ symbol_get возвращает NULL (при дальнейшем чтении symbol_get / __ symbol_get просматривает ядро ​​итаблицы символов существующих модулей, которые содержат только экспортированный символ, и должны убедиться, что модуль, из которого экспортируется символ, действительно загружен)

Есть ли в любом случае доступ к символам, которые не экспортируются из модуля ядра?

После большого количества чтения и просмотра ответов, представленных людьми, кажется, что будет очень трудно найти один метод во многих версиях ядра, так как kAPI значительно меняется со временем.

Ответы [ 2 ]

5 голосов
/ 01 апреля 2012

Если производительность не имеет большого значения, вы можете просмотреть весь список символов с помощью kallsyms_on_each_symbol() (экспортируется ядром для модулей GPL) и проверить имена, чтобы получить те, которые вам нужны. Я не рекомендовал бы делать это, если нет другого выбора, хотя.

Если вы хотите пойти по этому пути, вот пример из одного из наших проектов. См. Использование kallsyms_on_each_symbol(), а также код symbol_walk_callback(), остальные части не имеют отношения к этому вопросу.

4 голосов
/ 31 марта 2012

Вы можете использовать метод, который вы упомянули ранее, получив его из / proc / kallsyms или просто использовать адрес, указанный в System.map (что тоже самое), это может показаться хакерским, но это то, как я видел это было сделано раньше (на самом деле никогда не приходилось делать это самому). Либо так, либо вы можете создать свое собственное ядро, в котором вы фактически выполняете EXPORT_SYMBOL для всего, что вы хотите экспортировать, но это не так переносимо.

...