Rendszerhívás elfogás

 ( funtom | 2009. január 3., szombat - 17:10 )

Sziasztok!

A következő példaprogramot szeretném lefordítani. (Ubuntu 8.10, Netbeans 6.5)

#include <linux/kernel.h>
#include <linux/module.h>
#include <sys/syscall.h>

extern void *sys_call_table[];

asmlinkage int (*eredeti_sys_exit)(int);

asmlinkage int sajat_exit (int error_code) {
printk("Szia! A sys_exit hívásakor ez volt a hibakód: %d\n",error_code);
return eredeti_sys_exit(error_code);
}

int init_module() {
eredeti_sys_exit=sys_call_table[__NR_exit];
sys_call_table[__NR_exit] = sajat_exit;
}

void cleanup_module() {
sys_call_table[__NR_exit] = eredeti_sys_exit;
}

Azonban a következő hibaüzenetet kapom:

gcc -c -g -DMODULE -D__KERNEL__ -DLINUX -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c
main.c:2:26: warning: linux/module.h: No such file or directory
main.c:7: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
main.c:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
main.c: In function ‘init_module’:
main.c:15: error: ‘eredeti_sys_exit’ undeclared (first use in this function)
main.c:15: error: (Each undeclared identifier is reported only once
main.c:15: error: for each function it appears in.)
main.c:16: error: ‘sajat_exit’ undeclared (first use in this function)
main.c: In function ‘cleanup_module’:
main.c:20: error: ‘eredeti_sys_exit’ undeclared (first use in this function)
make[2]: *** [build/Debug/GNU-Linux-x86/main.o] Error 1
make[2]: Leaving directory `/home/tom/NetBeansProjects/pelda2'
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/home/tom/NetBeansProjects/pelda2'
make: *** [.build-impl] Error 2

Ha megadom az include pathba "/lib/modules/2.6.27-9-generic/build/include/" elérési utat, továbbra sem hajlandó lefordulni.

gcc -c -g -DMODULE -D__KERNEL__ -DLINUX -I/lib/modules/2.6.27-9-generic/build/include -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c
/lib/modules/2.6.27-9-generic/build/include/linux/ratelimit.h: In function ‘ratelimit’:
In file included from /lib/modules/2.6.27-9-generic/build/include/linux/kernel.h:18,
from main.c:1:
/lib/modules/2.6.27-9-generic/build/include/linux/ratelimit.h:23: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/lib/modules/2.6.27-9-generic/build/include/linux/ratelimit.h:23: error: (Each undeclared identifier is reported only once
/lib/modules/2.6.27-9-generic/build/include/linux/ratelimit.h:23: error: for each function it appears in.)
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h: At top level:
In file included from /lib/modules/2.6.27-9-generic/build/include/linux/prefetch.h:14,
from /lib/modules/2.6.27-9-generic/build/include/linux/list.h:6,
from /lib/modules/2.6.27-9-generic/build/include/linux/module.h:9,
from main.c:2:
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h:112: error: ‘CONFIG_X86_L1_CACHE_SHIFT’ undeclared here (not in a function)
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h:112: error: requested alignment is not a constant
In file included from /lib/modules/2.6.27-9-generic/build/include/linux/prefetch.h:14,
from /lib/modules/2.6.27-9-generic/build/include/linux/list.h:6,
from /lib/modules/2.6.27-9-generic/build/include/linux/module.h:9,
from main.c:2:
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h:152:1: warning: "cache_line_size" redefined
In file included from /lib/modules/2.6.27-9-generic/build/include/asm/pda.h:7,
from /lib/modules/2.6.27-9-generic/build/include/asm/current.h:19,
from /lib/modules/2.6.27-9-generic/build/include/asm/processor.h:15,
from /lib/modules/2.6.27-9-generic/build/include/linux/prefetch.h:14,
from /lib/modules/2.6.27-9-generic/build/include/linux/list.h:6,
from /lib/modules/2.6.27-9-generic/build/include/linux/module.h:9,
from main.c:2:
/lib/modules/2.6.27-9-generic/build/include/linux/cache.h:64:1: warning: this is the location of the previous definition
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h: In function ‘load_cr3’:
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h:184: error: ‘CONFIG_PAGE_OFFSETUL’ undeclared (first use in this function)
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h: At top level:
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h:233: error: requested alignment is not a constant
/lib/modules/2.6.27-9-generic/build/include/asm/processor.h:270: error: requested alignment is not a constant
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h: In function ‘elf_common_init’:
In file included from /lib/modules/2.6.27-9-generic/build/include/linux/elf.h:7,
from /lib/modules/2.6.27-9-generic/build/include/linux/module.h:14,
from main.c:2:
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h:166: error: ‘struct pt_regs’ has no member named ‘r8’
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h:166: error: ‘struct pt_regs’ has no member named ‘r9’
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h:166: error: ‘struct pt_regs’ has no member named ‘r10’
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h:166: error: ‘struct pt_regs’ has no member named ‘r11’
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h:167: error: ‘struct pt_regs’ has no member named ‘r12’
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h:167: error: ‘struct pt_regs’ has no member named ‘r13’
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h:167: error: ‘struct pt_regs’ has no member named ‘r14’
/lib/modules/2.6.27-9-generic/build/include/asm/elf.h:167: error: ‘struct pt_regs’ has no member named ‘r15’
In file included from /lib/modules/2.6.27-9-generic/build/include/linux/module.h:21,
from main.c:2:
/lib/modules/2.6.27-9-generic/build/include/asm/module.h:70:2: error: #error unknown processor family
make[2]: *** [build/Debug/GNU-Linux-x86/main.o] Error 1
make[2]: Leaving directory `/home/tom/NetBeansProjects/pelda2'
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory `/home/tom/NetBeansProjects/pelda2'
make: *** [.build-impl] Error 2

Build failed. Exit value 2.

Van valakinek ötlet mivel probálkozzam?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Egyrészt fent van-e ha jól sejtem a linux-source, amiben van a module.h, másrészt benne van-e az include pathban?

--
The Net is indeed vast and infinite...
http://gablog.eu

Mint írtam a Ha megadom az include pathba "/lib/modules/2.6.27-9-generic/build/include/" elérési utat, továbbra sem hajlandó lefordulni. Tehát a linux-headers fenn van. (Mellesleg a source is, igaz azzal még nem próbáltam.)

Szerk:
gcc -c -g -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux/include -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c
/usr/src/linux/include/linux/ratelimit.h: In function ‘ratelimit’:
In file included from /usr/src/linux/include/linux/kernel.h:18,
from main.c:1:
/usr/src/linux/include/linux/ratelimit.h:23: error: ‘CONFIG_HZ’ undeclared (first use in this function)
/usr/src/linux/include/linux/ratelimit.h:23: error: (Each undeclared identifier is reported only once
/usr/src/linux/include/linux/ratelimit.h:23: error: for each function it appears in.)
/usr/src/linux/include/asm/processor.h: At top level:
...

Így sem jó.

Siman kezzel hasznalod a gcc -t ?
http://tldp.org/LDP/lkmpg/2.6/html/x181.html

#include <sys/syscall.h>

helyett:

#include <linux/unistd.h>

Ja es legyen visszateresi erteke az init_module -nak.


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Simán kézzel használva is ugyanaz a hiba.

tom@tom-desktop:~/NetBeansProjects/pelda2$ gcc -Wall -DMODULE -D__KERNEL__ -DLINUX -I /lib/modules/2.6.27-9-generic/build/include/ -c main.c
In file included from /lib/modules/2.6.27-9-generic/build/include/linux/kernel.h:18,
from main.c:1:
/lib/modules/2.6.27-9-generic/build/include/linux/ratelimit.h: In function ‘ratelimit’:
/lib/modules/2.6.27-9-generic/build/include/linux/ratelimit.h:23: error: ‘CONFIG_HZ’ undeclared (first use in this function)
...

Az include csere sem segített.

Eredetileg a példa programot innen vettem: http://skl-projekt.hu/downloads.php?cat_id=79&download_id=185

turul@gluon8 /tmp/testmod $ make clean
make -C /lib/modules/2.6.28-gentoo/build M=/tmp/testmod clean
make[1]: Entering directory `/usr/src/linux-2.6.28-gentoo'
CLEAN /tmp/testmod/.tmp_versions
CLEAN /tmp/testmod/Module.symvers
make[1]: Leaving directory `/usr/src/linux-2.6.28-gentoo'
turul@gluon8 /tmp/testmod $ cat exithook.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/unistd.h>

extern void *sys_call_table[];

asmlinkage int (*eredeti_sys_exit)(int);

asmlinkage int sajat_exit (int error_code) {
printk("Szia! A sys_exit hívásakor ez volt a hibakód: %d\n",error_code);
return eredeti_sys_exit(error_code);
}

int init_module() {
eredeti_sys_exit=sys_call_table[__NR_exit];
sys_call_table[__NR_exit] = sajat_exit;
return 0;
}

void cleanup_module() {
sys_call_table[__NR_exit] = eredeti_sys_exit;
}
turul@gluon8 /tmp/testmod $ cat Makefile
obj-m += exithook.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
turul@gluon8 /tmp/testmod $ make
make -C /lib/modules/2.6.28-gentoo/build M=/tmp/testmod modules
make[1]: Entering directory `/usr/src/linux-2.6.28-gentoo'
CC [M] /tmp/testmod/exithook.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "sys_call_table" [/tmp/testmod/exithook.ko] undefined!
CC /tmp/testmod/exithook.mod.o
LD [M] /tmp/testmod/exithook.ko
make[1]: Leaving directory `/usr/src/linux-2.6.28-gentoo'
turul@gluon8 /tmp/testmod $

Nekem igy lefordul, de valoszinuleg meg rossz.

Ugy nez ki mintha neked kernel forrasod nem lenne koser, includolj valamit hamarabb ami deklaralja CONFIG_HZ -t, vagy a module.h tedd elore.

sys_call_table -t nem fogod ilyen konyen elerni szerintem.


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Köszi így végre nekem is lefordult.

tom@tom-desktop:~/NetBeansProjects/testmod$ make -C /lib/modules/`uname -r`/build M=~/NetBeansProjects/testmod modules
make: Entering directory `/usr/src/linux-headers-2.6.27-9-generic'
Building modules, stage 2.
MODPOST 1 modules
WARNING: "sys_call_table" [/home/tom/NetBeansProjects/testmod/exithook.ko] undefined!
make: Leaving directory `/usr/src/linux-headers-2.6.27-9-generic'

Azoban tényleg valami nem stimmel még.

tom@tom-desktop:~/NetBeansProjects/testmod$ sudo modprobe ./exithook.ko
FATAL: Module ./exithook.ko not found.

sudo insmod ./exithook.ko
-al probald inkabb.


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

sudo insmod ./exithook.ko
insmod: error inserting './exithook.ko': -1 Unknown symbol in module

sys_call_table -t nem talaja.
Evek ota nem ilyen egyszeru a dolog, nincs exportalva.
12 -ben meg igy nezett ki a dolog:
cat /boot/System.map-2.6.12-gentoo-r1 |grep sys_call
ffffffff8010eb3b T ret_from_sys_call
ffffffff8010ed1c T int_ret_from_sys_call
ffffffff80534ef0 r __ksymtab_ia32_sys_call_table
ffffffff80540d50 r __kstrtab_ia32_sys_call_table
ffffffff805596c0 D ia32_sys_call_table
ffffffff80695cc0 D sys_call_table
most is ilyesmi:
cat /boot/System.map-2.6.17-gentoo-r7 | grep sys_call
ffffffff81068613 T ret_from_sys_call
ffffffff8106878c T int_ret_from_sys_call
ffffffff8147e320 R sys_call_table
ffffffff8147f010 R ia32_sys_call_table
ffffffff815bc8a0 r __ksymtab_ia32_sys_call_table
ffffffff815ca4c0 r __kstrtab_ia32_sys_call_table

Az a D -> R ezt okozza.

http://www.redhat.com/magazine/005mar05/features/kprobes/

vagy library hook -al probalkozz, itt egy pelda az openre:


Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Igazad lehet...

Most próbálkoztam először kernel modul írással (jelen esetben copy-paste). De úgy tűnik túl régi kernelhez van a leírás... Keresek újabbat. Ha esetleg tud valaki jót magyarul, (rosszabb esetben angolul) akkor azt megköszönném. :)

autoconf.h-t behúzod?
ami a config.h helyett van már egy ideje, valószínűleg az tartalmazza a CONFIG_HZ-t
___
info

#include < linux/autoconf.h >

ezt add hozzá
___
info

Köszi, ez is segített, most eljutott a linkerig (egy kis további hekkelés után).

build/Debug/GNU-Linux-x86/main.o: In function `sajat_exit':
/home/tom/NetBeansProjects/pelda2/main.c:11: undefined reference to `printk'
build/Debug/GNU-Linux-x86/main.o: In function `init_module':
/home/tom/NetBeansProjects/pelda2/main.c:16: undefined reference to `sys_call_table'
/home/tom/NetBeansProjects/pelda2/main.c:17: undefined reference to `sys_call_table'
build/Debug/GNU-Linux-x86/main.o: In function `cleanup_module':
/home/tom/NetBeansProjects/pelda2/main.c:21: undefined reference to `sys_call_table'
collect2: ld returned 1 exit status

Melyik lib tartalmazza ezeket?

lib nem tartalmazza, valamelyik kernelojjektumba van elrejtve.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

printk: < linux/kernel.h >
___
info

Lehet, hogy nem a feltett kérdésre válaszolok, de az "strace" (2) program nem jó az eredeti (általam ismeretlen) feladat megoldásához?

De tökéletesen szerintem jó lenne. Csakhogy programozni akartam, nem feladatot megoldani. :)