nixp.ru v3.0

21 января 2017,
суббота,
03:03:41 MSK

DevOps с компанией «Флант»
NIXdummy написал 8 июля 2008 года в 12:44 (1654 просмотра) Ведет себя как мужчина; открыл 5 тем в форуме, оставил 17 комментариев на сайте.

Начну с конца:

В чем отличие между #include <> и #include «» ?

Дело в том, что если в коде стоит #include — то в ошибках выдается:

gen-devlist.c:7:19: error: stdio.h — файлнотфаунд, а когда stdio.h стоит в кавычках, он выплевывает кучу других ненайденных заголовков. как быть? и вообще, где ищутся файлы перечисляемые после слова include в одном и другом случае?

А теперь собственно с чего все началось:

Захотелось мне скомпилировать собственную прошивку для D-Link DI-524UP.

Захотелось, потомучто в нем есть USB-порт, который было бы здорово научить понимать не только принтеры, но и другие устройств типа флэшек. Есть сайт на котором один энтузиаст этого дела успешно справился с такой задачей (http://ossfans.org/DI524UP/). Однако у меня сделать это по его методике не выходит, хотя делаю вроде бы все тоже самое что и он. Первый затык у меня появляется, когда я пишу make menuconfig — при этом выдется, что у меня якобы нету библиотек ncurses, хотя на самом деле они есть — ncurses-5 и даже ncurses-5.5 кажется. Ну да ладно, благо обычный make config срабатывает без ошибок. make dep тоже все делает без запинок. А вот окончательный make стопорит на файле /linux-2.4.x/drivers/pci/gen-devlist.c , так как не находит двух заголовков string.h и stdio.h соответственно.

Куда я только эти файлы не пихал! и во все includ-ы и во все lib-ы всеравно — файлнотфаунд. даже впихнул в переменную окружения путь к ним — пофигу, файлнотфунд и все тут!

Помогите чем можете, пожалуйста (второй месяц уже пошел).

P.S.: прошу модераторов, если сочтут нужным перенести мой пост куда следует, если он не соответствует этому разделу — только не удаляйте.

DimkaS
NIXdummy
Первый затык у меня появляется, когда я пишу make menuconfig — при этом выдется, что у меня якобы нету библиотек ncurses, хотя на самом деле они есть — ncurses-5 и даже ncurses-5.5 кажется.

libncurses5-dev

Было б неплохо увидеть логи, а не сказки-пересказки.

Я дико извиняюсь, но логи смогу показать только послезавтра (я сегодня-завтра на работе, а машина в другом месте). Могу только сказать что другие исходники из вышеприведенной директории собираются нормально и без ошибок, хотя там в начале стоит #include или другие заголовки. В директорию linux я соответственно пробовал скопировать stdio.h переписав соответственно строку c include-ом — не помогает, в директорию уровнем выше тоже копировал stdio.h — тоже не помогает.

Все-таки что означает в исходнике <> или «» после include?

Где в первом и втором случае будут искаться заголовки?

metal
NIXdummy
Начну с конца:

В чем отличие между #include <> и #include «» ?

#include <> — системный заголовочный файл.

#include «» — заголовочный файл твоей программы.

Отличия в путях поиска, «» ищется в текущем каталоге, <> в системных.

Дело в том, что если в коде стоит #include — то в ошибках выдается:

gen-devlist.c:7:19: error: stdio.h — файлнотфаунд, а когда stdio.h стоит в кавычках, он выплевывает кучу других ненайденных заголовков. как быть?

Это более чем странно (как я понимаю ты компилируешь что-то ядерное), в ядре нельзя использовать стандартную библиотеку, а stdio.h — заголовочный файл стандартной библиотеки.

и вообще, где ищутся файлы перечисляемые после слова include в одном и другом случае?

Смотри выше, также обрати внимание на параметр -I при компиляции.

А вот окончательный make стопорит на файле /linux-2.4.x/drivers/pci/gen-devlist.c , так как не находит двух заголовков string.h и stdio.h соответственно.

Совет закоментить эти include в исходнике и посмотреть что получиться. Ошибки сюда :)

Anarchist
metal
в ядре нельзя использовать стандартную библиотеку

Интересно почему.

Разверни :)

Ну вот и обещанные логи (это для исходника с #include ):

make V=1 ARCH=mips CROSS_COMPILE=/opt/cross/mips-patfree-uclibc/bin/mips-linux- -C linux-2.4.x || exit 1

make[1]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x'

. scripts/mkversion > .tmpversion

/opt/cross/mips-patfree-uclibc/bin/mips-linux-gcc -D__KERNEL__ -I/home/maxos/DL/GPL_Di524up/linux-2.4.x/include -DUSB_LED_GPIO_A5 -DDI524UP=1 -DUSER_DEFINE_DAYLIGHT_SAVING=1 -Wall -Wstrict-prototypes -Wno-trigraphs -O1 -gdwarf-2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -I /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=r3000 -mips1 -Wa,-32 -Wa,-march=r3000 -Wa,-mips1 -DUTS_MACHINE=’«mips»' -DKBUILD_BASENAME=version -c -o init/version.o init/version.c

make CFLAGS="-D__KERNEL__ -I/home/maxos/DL/GPL_Di524up/linux-2.4.x/include -DUSB_LED_GPIO_A5 -DDI524UP=1 -DUSER_DEFINE_DAYLIGHT_SAVING=1 -Wall -Wstrict-prototypes -Wno-trigraphs -O1 -gdwarf-2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -I /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=r3000 -mips1 -Wa,-32 -Wa,-march=r3000 -Wa,-mips1 » -C arch/mips/tools

make[2]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/arch/mips/tools'

cmp -s offset.h /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm-mips/offset.h || (cp offset.h /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm-mips/offset.h.new && mv /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm-mips/offset.h.new /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm-mips/offset.h)

make[2]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/arch/mips/tools'

make CFLAGS="-D__KERNEL__ -I/home/maxos/DL/GPL_Di524up/linux-2.4.x/include -DUSB_LED_GPIO_A5 -DDI524UP=1 -DUSER_DEFINE_DAYLIGHT_SAVING=1 -Wall -Wstrict-prototypes -Wno-trigraphs -O1 -gdwarf-2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -I /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=r3000 -mips1 -Wa,-32 -Wa,-march=r3000 -Wa,-mips1 » -C kernel

make[2]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/kernel'

make all_targets

make[3]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/kernel'

make[3]: Nothing to be done for `all_targets’.

make[3]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/kernel'

make[2]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/kernel'

make CFLAGS="-D__KERNEL__ -I/home/maxos/DL/GPL_Di524up/linux-2.4.x/include -DUSB_LED_GPIO_A5 -DDI524UP=1 -DUSER_DEFINE_DAYLIGHT_SAVING=1 -Wall -Wstrict-prototypes -Wno-trigraphs -O1 -gdwarf-2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -I /home/maxos/DL/GPL_Di524up/linux-2.4.x/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=r3000 -mips1 -Wa,-32 -Wa,-march=r3000 -Wa,-mips1 » -C drivers

make[2]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers'

make -C block

make[3]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/block'

make all_targets

make[4]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/block'

make[4]: Nothing to be done for `all_targets’.

make[4]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/block'

make -C parport

make[3]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/parport'

make all_targets

make[4]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/parport'

make[4]: Nothing to be done for `all_targets’.

make[4]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/parport'

make[3]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/parport'

make -C pci

make[3]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/pci'

make all_targets

make[4]: Entering directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/pci'

unset GCC_EXEC_PREFIX; gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o gen-devlist gen-devlist.c

gen-devlist.c:7:20: error: string.h: No such file or directory

gen-devlist.c:8:19: error: stdio.h: No such file or directory

gen-devlist.c:13: error: expected ')' before '*' token

gen-devlist.c: In function 'main’:

gen-devlist.c:37: error: 'FILE' undeclared (first use in this function)

gen-devlist.c:37: error: (Each undeclared identifier is reported only once

gen-devlist.c:37: error: for each function it appears in.)

gen-devlist.c:37: error: 'devf' undeclared (first use in this function)

gen-devlist.c:37: error: 'clsf' undeclared (first use in this function)

gen-devlist.c:37: warning: left-hand operand of comma expression has no effect

gen-devlist.c:39: warning: implicit declaration of function 'fopen'

gen-devlist.c:42: warning: implicit declaration of function 'fprintf'

gen-devlist.c:42: warning: incompatible implicit declaration of built-in function 'fprintf'

gen-devlist.c:42: error: ’stderr' undeclared (first use in this function)

gen-devlist.c:46: warning: implicit declaration of function 'fgets'

gen-devlist.c:46: error: ’stdin' undeclared (first use in this function)

gen-devlist.c:48: warning: implicit declaration of function ’strchr'

gen-devlist.c:48: warning: incompatible implicit declaration of built-in function ’strchr'

gen-devlist.c:53: warning: implicit declaration of function ’strlen'

gen-devlist.c:53: warning: incompatible implicit declaration of built-in function ’strlen'

gen-devlist.c:65: warning: incompatible implicit declaration of built-in function ’strlen'

gen-devlist.c:75: warning: incompatible implicit declaration of built-in function 'fprintf'

gen-devlist.c:80: warning: incompatible implicit declaration of built-in function 'fprintf'

gen-devlist.c:81: warning: implicit declaration of function 'pq'

gen-devlist.c:82: warning: implicit declaration of function 'fputs'

gen-devlist.c:90: warning: incompatible implicit declaration of built-in function 'fprintf'

gen-devlist.c:96: warning: incompatible implicit declaration of built-in function ’strlen'

gen-devlist.c:103: warning: implicit declaration of function ’strcpy'

gen-devlist.c:103: warning: incompatible implicit declaration of built-in function ’strcpy'

gen-devlist.c:106: warning: incompatible implicit declaration of built-in function 'fprintf'

gen-devlist.c:109: warning: incompatible implicit declaration of built-in function 'fprintf'

gen-devlist.c:115: warning: incompatible implicit declaration of built-in function 'fprintf'

gen-devlist.c:126: warning: implicit declaration of function 'fclose'

make[4]: * [gen-devlist] Error 1

make[4]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/pci'

make[3]: * [first_rule] Error 2

make[3]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers/pci'

make[2]: * [_subdir_pci] Error 2

make[2]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x/drivers'

make[1]: * [_dir_drivers] Error 2

make[1]: Leaving directory `/home/maxos/DL/GPL_Di524up/linux-2.4.x'

make: * [linux] Ошибка 1

сам исходник:

/*

* Generate devlist.h and classlist.h from the PCI ID file.

*

* (c) 1999—2002 Martin Mares

*/

#include

#include

#define MAX_NAME_SIZE 79

static void

pq(FILE *f, const char *c)

{

while (*c) {

if (*c == '»’)

fprintf(f, «\\\»»);

else {

fputc(*c, f);

if (*c == '?' && c[1] == '?’) {

/* Avoid trigraphs */

fprintf(f, «\» \"»);

}

}

c++;

}

}

int

main(void)

{

char line[1024], *c, *bra, vend[8];

int vendors = 0;

int mode = 0;

int lino = 0;

int vendor_len = 0;

FILE *devf, *clsf;

devf = fopen(«devlist.h», «w»);

clsf = fopen(«classlist.h», «w»);

if (!devf || !clsf) {

fprintf(stderr, «Cannot create output file!\n»);

return 1;

}

while (fgets(line, sizeof(line)-1, stdin)) {

lino++;

if ((c = strchr(line, '\n’)))

*c = 0;

if (!line[0] || line[0] == '#’)

continue;

if (line[1] == ' ') {

if (line[0] == 'C' && strlen(line) > 4 && line[4] == ' ') {

vend[0] = line[2];

vend[1] = line[3];

vend[2] = 0;

mode = 2;

} else goto err;

}

else if (line[0] == '\t’) {

if (line[1] == '\t’)

continue;

switch (mode) {

case 1:

if (strlen(line) > 5 && line[5] == ' ') {

c = line + 5;

while (*c == ' ')

*c++ = 0;

if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {

/* Too long, try cutting off long description */

bra = strchr(c, '[');

if (bra && bra > c && bra[-1] == ' ')

bra[-1] = 0;

if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {

fprintf(stderr, «Line %d: Device name too long\n», lino);

fprintf(stderr, «%s\n», c);

return 1;

}

}

fprintf(devf, «\tDEVICE(%s,%s,\»», vend, line+1);

pq(devf, c);

fputs(«\»)\n», devf);

} else goto err;

break;

case 2:

if (strlen(line) > 3 && line[3] == ' ') {

c = line + 3;

while (*c == ' ')

*c++ = 0;

fprintf(clsf, «CLASS(%s%s, \«%s\»)\n», vend, line+1, c);

} else goto err;

break;

default:

goto err;

}

} else if (strlen(line) > 4 && line[4] == ' ') {

c = line + 4;

while (*c == ' ')

*c++ = 0;

if (vendors)

fputs(«ENDVENDOR()\n\n», devf);

vendors++;

strcpy(vend, line);

vendor_len = strlen(c);

if (vendor_len + 24 > MAX_NAME_SIZE) {

fprintf(stderr, «Line %d: Vendor name too long\n», lino);

return 1;

}

fprintf(devf, «VENDOR(%s,\»», vend);

pq(devf, c);

fputs(«\»)\n», devf);

mode = 1;

} else {

err:

fprintf(stderr, «Line %d: Syntax error in mode %d: %s\n», lino, mode, line);

return 1;

}

}

fputs(«ENDVENDOR()\n\

\n\

#undef VENDOR\n\

#undef DEVICE\n\

#undef ENDVENDOR\n», devf);

fputs(«\n#undef CLASS\n», clsf);

fclose(devf);

fclose(clsf);

return 0;

}

Если в исходнике удалить #include в ошибках просто пропадают строки

gen-devlist.c:7:20: error: string.h: No such file or directory

gen-devlist.c:8:19: error: stdio.h: No such file or directory

metal
Anarchist
Интересно почему.

Разверни :)

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

metal
NIXdummy
сам исходник:

Этот исходник не имеет никакого отношения к коду ядра. Его надо компилировать отдельно, выглядит как самодостаточный.

Гигантское МЕГАСПАСИБО DimkaS-у!

Поставил libncurses5-dev и откомпилил этот нескастный gen-devlist.c

(дело я думаю в том, что вместе с этим пакетом был установлен как зависимость kernel-headers-чо-то-там — вот и нашелся на нужном месте stdio.h)

однако до конца все равно не докомпилил — споткнуля о какой-то gsasl.

ну с этим я пока сам поковыряюсь — благо в ссылочке которую я приводил чел рассказывает как с этим справится.

но я в этом посте еще появлюсь со своими недосборками.

когда соберу обязуюсь куда-нть выложить.

P.S.: а есть ли у дебиана установка «для разработчика» (как во фрях)? если есть — мож мне просто переставить систему (со всеми исходниками, библиотеками и компиляторами)?

Anarchist
NIXdummy
а есть ли у дебиана установка «для разработчика» (как во фрях)? если есть — мож мне просто переставить систему (со всеми исходниками, библиотеками и компиляторами)?

Нужна система для разработчика без лишних заморочек — смотри в сторону Gentoo.

ОХ да простят меня модераторы (кажыся это уже флуд) — но я таки собрал ее!

Прошивка — один в один как у Д-Линка,

НО!

дата прошивки сегодняшнее число! (УРРРАААА!)

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

заставить make НЕ СОБИРАТЬ поддержку принтера удалось вычистив почти полностью директорию ~/GPL_Di524up/user/LPRng-3.8.27

Makefile в этой директории пришлось сохранить, оставив в нем одну единственную запись «romfs:»

Ну теперь процесс налажен — надо в нее теперь впихнуть поддержку флэшек, ssh и можно выкладывать. (если кому интересно, могу и эту прошивку выложить)

To DimkaS:

Уж не знаю правильно это или нет, но данный код не видел ncurses и на другой машине (я тут решил продолжить муки на работе) — и это при установленных пакетах ncurses-base, ncurses-bin, ncurses-term, libncurses5, libncurses5-dev и libncursesw5. А команда make menuconfig заработала только после установки в системе обычного gcc (это при том что gcc-3.3 3.4 4.1 УЖЕ были установлены с самого начала! МАЛО ему 3-х последних версий компилятора — без первой собираться не буду НИВКАКУЮ!)

DimkaS

Хм.. обычно -dev пакеты решают проблемы.

А кто есть обычный gcc? Просто у меня в Дебе gcc начинается с gcc-2.95. Может, у тебя просто симлинка не было?

$ ls -l `which gcc`

lrwxrwxrwx 1 root root 7 Июн 26 01:08 /usr/bin/gcc -> gcc-4.3

To DimkaS:

Под обычным gcc я имел в виду тот который в SynapticPacketManager был указан без «-х.уу.zz» тоесть без версии и не был помечен как установленный.

Насчет симлинка — скорей всего так оно и было, точно не скажу.

Кстати после последующих сборок я был слегка разочарован — D-Link исходник то выложил, да вот тока все самое вкусное из него выкинул (например тотже sshd и другие проги)! Буду качать дистриб uClinux-а

Ну вот более-менее нормальная прошивка получилась.Как и обещал даю ссылочку, кому интересно — забирайте:

http://dlink-hack.narod.ru/ftproot.bix

на Di-524up ревизии A2 заливается отлично через веб интерфейс.

Плюсы: в ней есть теперь телнет и фтп сервера (через inetd), исправно опознает, пишет/читает флэшки (даже через хаб), родной вэб интерфейс сохранен.

Минусы: фтп работает только под рутом (логин/пасс: root/ghjibdrf), флэшки монтируются не в mnt или media, а в /var/usbmnt/ причем конечное название каталога зависит от модели флэшки (/var/usbmnt/disk0(JetFlashASDf321), /var/usbmnt/disk1(TranscendShit987abc) и т.д.), все директории кроме /var заблокированы на запись — включая /etc (то есть поменять какие-либо настройки кроме сетевых врядли выйдет)

На этом я думаю тему можно закрыть, всем огромное спасибо за помощь.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.