2013-05-14 3 views
1

Я недавно скомпилированной собственного ядра, которое определяет семью нового адреса семьи/протокол под названием «AF_CUSTOM»проблемы компиляция простой программы C против пользовательского ядра Linux

Такие, включает в себя/Linux/socket.h в источнике моего ядра был изменилось, как показано здесь (а также для PF_CUSTOM):

#define AF_NFC  39 /* NFC sockets   */ 
#define AF_CUSTOM  40 /* Custom sockets   */ 
#define AF_MAX  41 /* For now.. */ 

Я планирую реализовать AF_CUSTOM, но как быстро проверить вменяемость, я решил изменить типичный пример программы с гнезда и посмотреть, если заменить «сокет (AF_INET , SOCK_STREAM, 0) "с" socket (AF_CUSTOM, SOCK_STREAM, 0) "будет компилироваться, но это не так. У меня возникла следующая ошибка при компиляции с помощью gcc: 'AF_CUSTOM' undeclared Я предположил, что он, по крайней мере, скомпилируется, потому что AF_CUSTOM должен быть определен в текущем ядре.

Проблема, как я вижу, заключается в том, что gcc использует заголовки ядра по умолчанию для разрешения «#include <sys/socket.h>», а не заголовки, соответствующие выполняемому в настоящее время ядру. Я попытался использовать оба параметра -I и -системы для gcc, чтобы направить его на путь, по которому Ubuntu помещает заголовки ядра для других ядер, поскольку они, похоже, были важны из моего исследования Google, но они не помогли.

Мой вопрос: Как я могу скомпилировать программу C для заголовков для текущего исполняемого ядра, а не для заголовков ядра по умолчанию.

Я попытался это: gcc -isystem /usr/src/linux-headers-3.8.8-custom.5/ sendOnCustom.c -o sendOnCustom

FYI, составленный с использованием косметики kpkg. Кроме того, это мой первый вопрос, я надеюсь, что это понятно.

+0

Is/usr/src/linux символическая ссылка? – James

+0

Вы имеете в виду /usr/src/linux-headers-3.8.8-custom.5/? Это не символическая ссылка, а только каталог. –

ответ

1

Общепринятой практикой в ​​системах Linux является использование «санированной» копии заголовков ядра Linux для создания программного обеспечения. Вероятно, GCC ищет заголовки не в/usr/src/linux, но в каком-то другом месте (которое, вероятно, зависит от дистрибутива) на моей машине, на которой работает Gentoo, эти заголовки помещаются в/usr/include/asm,/usr/include/linux, ...).

Эта страница содержит больше информации об этом: http://headers.cross-lfs.org/

Я думаю, что вам нужно сделать очень уверен, что при компиляции включаемых путь имеет/USR/SRC/Linux в нем (или там, где измененный заголовок is), и эта строка должна, по крайней мере, прибыть перед другими дезинфицированными заголовками, если вы не можете полностью их опустить.

Следует отметить, что из вашего сообщения кажется, что вы ожидаете, что любые символы, определенные для текущего ядра, будут определены везде - это не тот случай. Всякий раз, когда вы компилируете программное обеспечение, определения, которые видит компилятор, не имеют никакого отношения к работающему ядру. Компилятор знает, как искать свой путь включения, чтобы попытаться найти заголовки, которые вы указали, и анализирует их.

+0

Спасибо, эта ссылка была полезна в объяснении концепции, что компиляторы будут использовать санированные заголовки ядра. В конце концов, я решил просто изменить санированные заголовки, чтобы отразить небольшое изменение, которое я сделал, поскольку мои изменения были простыми, но создавали проблемы для включений и моих неполных компиляционных знаний. –

Смежные вопросы