Linux-apparaatstuurprogramma ed 3 codecompilatiefouten en Linux-headerbestanden

Ik probeer de voorbeelden van Linux Device Drivers, ed 3 (ldd3) te gebruiken voordat ik met het boek ga werken, zodat ik een aantal werkende voorbeelden kan hebben die ik kan gebruiken .... Ik krijg het volgende fouten (zie fout in Debian squeeze en ook Crunchbang Linux):

inp.c:33:20: error: [u]asm/io.h:[/u] No such file or directory

toen ik naar de makefile keek, vond ik dit (waarvan ik denk dat het het probleem is):

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
INCLUDEDIR = $(KERNELDIR)/include

inhoud van/lib/modules/ uname -r /build die een link is naar /usr/src/linux-headers-2.6.39-bpo.2-486/

    $ uname -r
    2.6.39-bpo.2-486

$ ls /lib/modules/`uname -r`/build
arch  include  Makefile  Module.symvers  scripts

$ ls /lib/modules/`uname -r`/build/include
config  generated  linux

De map die eruitziet, heeft niet de vereiste bestanden. Ik vond de bestanden die nodig zijn onder /usr/src/linux-headers-2.6.39-bpo.2-common/ en het ontbrekende asm/io.h-bestand @ /usr/src/linux-headers-2.6.39-bpo. 2-common/include/asm-generic /

$ ls /usr/src/linux-headers-2.6.39-bpo.2-common/
arch  include  Kbuild  Makefile  scripts

$ ls /usr/src/linux-headers-2.6.39-bpo.2-common/include/
acpi         crypto  Kbuild  linux     media  net     rdma   scsi   staging  trace  xen
asm-generic  drm     keys    math-emu  mtd    pcmcia  rxrpc  sound  target   video

Moet ik elk pakket installeren om de bestanden in die map te krijgen ... Ik heb linux-headers- uname -r -pakket al geïnstalleerd (zowel Debian als Crunchbang) ... In gnewse ik vond de bestanden in/lib/modules/$ (shell uname -r)/build ... maar het was een oudere kernel ... dus niet zeker of de mapstructuur onder linux verandert ... of is het distro specifiek .. . laat me alsjeblieft weten hoe krijg ik de compilatie aan de gang .... Ik ben niet zo goed met Makefiles dus hoe kan ik de makefile veranderen zodat het naar de header-bestanden in de andere mappen gaat zoeken ....

Bedankt, asp5

2
Even een korte opmerking: ik denk niet dat uw map /lib/modules/$ (uname -r)/build/ correct is ingevuld. Weet je zeker dat je de juiste pakketten hebt geïnstalleerd? ls/lib/modules/$ (uname -r)/build | wc -l op mijn systeem geeft "27" weer. .../include/ heeft 24 items, inclusief .../include/asm (symbolische link naar asm-x86 ).
toegevoegd de auteur sarnold, de bron
@sarnold: Ik heb het linux-headers- uname -r -pakket geïnstalleerd waarvan ik denk dat het alle vereiste headers moet installeren (in Debian en derivaten) ... kun je me vertellen welke distro je gebruikt en de kernelversie ... Ik kan veel items in die map zien wanneer ik gnewsense distro gebruik ... maar helaas kan ik het niet op mijn nieuwe laptop laten werken ... ik heb sowieso de juiste pakketten geïnstalleerd, maar de compilatie verloopt soepel ... Bedankt.
toegevoegd de auteur asp5, de bron

1 antwoord

Allereerst, LDD3 is vrij oud en het zou me niet verbazen als header-bestanden mogelijk zijn verplaatst. Javier Martinez Canillas heeft de LDD3-bronnen bijgewerkt voor modernere kernels .

Toen ik dit een beetje verder onderzocht, merkte ik dat de asm -symlink een tijdje was verbroken. ( io.h lijkt om de een of andere reden te zijn opgeslagen in asm generiek/.) Als u nieuwsgierig bent, Ik heb een foutenrapport ingediend bij Ubuntu voor de kapotte symlinks.

For whatever it's worth, I can build a module referencing either or (though as Hasturkun reminds me, you shouldn't use asm-generic directly):

$ cat > Makefile
obj-m = foo.o
$ cat > foo.c
#include 
#include 
#include 
int init_module() { return 0; }
void cleanup_module() { }
$ make -C /lib/modules/`uname -r`/build M=$PWD
make: Entering directory `/usr/src/linux-headers-2.6.38-12-generic'
  LD      /home/sarnold/tmp/module/built-in.o
  CC [M]  /home/sarnold/tmp/module/foo.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/sarnold/tmp/module/foo.mod.o
  LD [M]  /home/sarnold/tmp/module/foo.ko
make: Leaving directory `/usr/src/linux-headers-2.6.38-12-generic'
$ cat > foo.c
#include 
#include 
#include 
int init_module() { return 0; }
void cleanup_module() { }
$ make -C /lib/modules/`uname -r`/build M=$PWD
make: Entering directory `/usr/src/linux-headers-2.6.38-12-generic'
  CC [M]  /home/sarnold/tmp/module/foo.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/sarnold/tmp/module/foo.mod.o
  LD [M]  /home/sarnold/tmp/module/foo.ko
make: Leaving directory `/usr/src/linux-headers-2.6.38-12-generic'
$ 
1
toegevoegd
@Hasturkun: bedankt voor die herinnering, bijgewerkt
toegevoegd de auteur sarnold, de bron
Uitstekend! Ik ben benieuwd wat hij specifiek moest veranderen ...
toegevoegd de auteur sarnold, de bron
De asm bevatten directory-levens onder arch/somearch/include/asm (waarbij somearch x86, arm, etc. is) AFAICT en moeten zich in het include-pad bevinden. u moet meestal niet verwijzen naar asm-generiek .
toegevoegd de auteur Hasturkun, de bron
@sarnold: de bijgewerkte broncode van Javier Martinez is probleemloos gecompileerd ... Bedankt voor de link ...
toegevoegd de auteur asp5, de bron
@sarnold: Ik geloof dat hij asm/io.h heeft vervangen door sys/io.h in misc-prog/inp.c en vergelijkbare wijzigingen ... Ik denk dat de headers zijn verplaatst zoals je zei en dat sommige functies verouderd zijn. .. niet zeker op dit moment wat er specifiek verandert ... Bedankt voor de hulp ...
toegevoegd de auteur asp5, de bron