Мы написали несколько модулей ядра и многие с экспортированными символами, которые все работают нормально, за исключением 2 символов (что сбивает с толку). Мы экспортировали их, как и все остальные, но два символа не экспортируются глобально после того, как они вставлены в ядро.
В нашем коде C мы имеем (в wdt.ko):
EXPORT_SYMBOL(WDT_Enable);
EXPORT_SYMBOL(WDT_Disable);
Если мы запустим nm
на сгенерированном объекте ядра, они появятся правильно:
nm wdt.ko | grep WDT
00000000 T WDT_Enable
00000000 T WDT_Disable
Это должно означать, что эти символы экспортируются глобально. Как только мы изменим объект ядра:
# insmod wdt.ko
# insmod apphandler.ko
apphandler: Unknown symbol WDT_Enable
apphandler: Unknown symbol WDT_Disable
Если мы посмотрим на каллсимсы:
# cat /proc/kallsyms | grep WDT
c12504dc t WDT_Enable [wdt]
c12502d8 t WDT_Disable [wdt]
Находясь внутри ядра, они не являются глобальными.
Мы подтвердили, что в ядро вставляется правильный файл и что функции видны в одном модуле, но мы не можем объяснить, почему символы внезапно становятся локальными, а не глобальными, как предлагает nm
.
Кто-нибудь знает, где может быть наша ошибка?
nm
и/proc/kallsyms
, не означает доступность для других модулей, которая контролируетсяEXPORT_SYMBOL
, см., Например, этот ответ. Кроме того, для того, чтобы символы make, определенные одним модулем, были доступны в другом, одногоEXPORT_SYMBOL
недостаточно. Вам нужно либо собрать оба модуля в одном каталоге, либо использовать переменнуюKBUILD_EXTRA_SYMBOLS
в make-файле для второго модуля: stackoverflow.com/a/32949236 / 3440745. - person Tsyvarev   schedule 26.10.2015