множественное определение функции-ошибки в файле ядра - PullRequest
1 голос
/ 28 февраля 2011

Привет, ребята. В настоящее время я пытаюсь перенести инструмент DigSig на ядро ​​CentOS, в котором, по-видимому, отсутствуют некоторые важные крипто-функции для DigSig. Итак, порт это просто новый /linux/crypto.h, который обладает необходимой мне функциональностью, плюс я добавил этот маленький код:

void kzfree(const void *p) {
    size_t ks;
    void *mem = (void *)p;

    if (unlikely(ZONP(mem)))
             return;
    ks = ksize(mem);
    memset(mem, 0, ks);
    kfree(mem);

}

потому что мое ядро, над которым я работаю, еще не имеет kzfree. Теперь, когда я пытаюсь скомпилировать DigSig, это вывод:

/home/Chris/dsTest/dsi_sysfs.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/digsig_cache.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/digsig_revocation.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here
/home/Chris/dsTest/dsi_sig_verify.o: In function `kzfree':
/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: multiple definition of `kzfree'
/home/Chris/dsTest/digsig.o:/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h:114: first defined here

Конечно, все покрыто # ifndef-Guards, поэтому я просто не могу понять, почему он определяет эту функцию несколько раз ... Есть идеи?

1 Ответ

1 голос
/ 28 февраля 2011

Ваш включаемый файл включается в несколько мест.Это не ошибка времени компиляции.Но скорее связанная ошибка времени.Каждый ваш файл был скомпилирован и сгенерирован следующим образом .o файлы

/home/Chris/dsTest/dsi_sysfs.o
/home/Chris/dsTest/digsig_cache.o
/home/Chris/dsTest/digsig_revocation.o
/home/Chris/dsTest/dsi_sig_verify.o

Теперь, связывая их вместе, он находит несколько определений kzfreez, по одному в приведенных выше файлах .o, потому что их соответствующие файлы c включают в себя

/usr/src/kernels/2.6.18-194.32.1.el5-i686/include/linux/crypto.h

У вас есть ifdef, который защищает файл, но это только предотвращает включение файла .h в один и тот же файл c (единицы перевода), но не в разные файлы c.

Вы должны написать функцию в файле c идобавьте в make-файлы, чтобы он компилировался отдельно и связывался.И только добавить объявление в crypto.h.(Для тестирования вы можете добавить определение в crypto.c и объявление в crypto.h).

...