_stext и _etext в ядре Linux 2.6 - почему мой модуль ядра не может ссылаться на них? - PullRequest
1 голос
/ 08 декабря 2011

У меня есть модуль ядра, который должен иметь доступ к символам _stext и _etext ядра.По какой-то причине, даже если в ядре есть определения для этих символов (/proc/kallsyms), всякий раз, когда я загружаю свой модуль, я получаю

mymodule: Unknown symbol _etext (err 0)
mymodule: Unknown symbol _stext (err 0)

Я не запускаю испорченное ядро, а все остальное в модулекажется, что ссылка в порядке.Существуют ли ограничения по модулю или лицензии для ссылок на _stext и _etext?Есть ли в ядре альтернативное определение, которое я мог бы использовать для начала и конца памяти кода?

Обновление:

Я смотрю на источник ядра, и в kallsyms.c есть это:

static int read_symbol_tr(const char *sym, unsigned long long addr)
{
size_t i;
struct text_range *tr;

for (i = 0; i < ARRAY_SIZE(text_ranges); ++i) {
    tr = &text_ranges[i];

    if (strcmp(sym, tr->stext) == 0) {
        tr->start = addr;
        return 0;
    } else if (strcmp(sym, tr->etext) == 0) {
        tr->end = addr;
        return 0;
    }
}

return 1;
}

Означает ли это, что _etext и_stext записи, которые я вижу /proc/kallsyms, являются поддельными символами, на которые модуль ядра не может на самом деле ссылаться?

1 Ответ

1 голос
/ 08 декабря 2011

Компоновщик модуля ядра будет связывать только те символы, которые были «экспортированы» с помощью дополнительного механизма: символ необходимо экспортировать с помощью EXPORT_SYMBOL() или EXPORT_SYMBOL_GPL().(Вариант _GPL указывает, что разработчики ядра помечают, что внутренний интерфейс и, следовательно, доступен только для кода, лицензированного по лицензии GPL.) Я не могу найти экспорты для _stext или _etext в моем ядреисточники, поэтому я не верю, что они доступны вам для использования.

Чего вы пытаетесь достичь?

...