Hallo,
wollte mal eben ein binary bauen, das nach dem booten eines Linux Kernels
ausgeführt werden soll.
Allerdings scheitert es schon an den kleinen Dingen.
Die Textausgaben stimmen schonmal.
Jetzt möchte ich gerne Dateien schreiben, lesen und anzeigen lassen.
wenn ich den Code unten, mit
gcc -c test01.c -o test01.o
übersetzen will, kommen die merkwürdigsten Meldungen:
test01.c: In function ‘write_file’:
test01.c:30:3: error: unknown type name ‘loff_t’
loff_t pos = 0;
^
test01.c:33:3: error: unknown type name ‘mm_segment_t’
mm_segment_t old_fs = get_fs();
^
test01.c:34:10: error: ‘KERNEL_DS’ undeclared (first use in this function)
set_fs(KERNEL_DS);
^
test01.c:34:10: note: each undeclared identifier is reported only once for each function it appears in
test01.c:36:27: error: ‘O_WRONLY’ undeclared (first use in this function)
fd = sys_open(filename, O_WRONLY|O_CREAT, 0644);
^
test01.c:36:36: error: ‘O_CREAT’ undeclared (first use in this function)
fd = sys_open(filename, O_WRONLY|O_CREAT, 0644);
^
test01.c:38:25: warning: incompatible implicit declaration of built-in function ‘strlen’
sys_write(fd, data, strlen(data));
^
test01.c:39:10: warning: assignment makes pointer from integer without a cast
file = fget(fd);
zweitens: wie kann man verzeichnisse mit kernel funktionen anzeigen lassen?
habe hier einen 4.2.1 linux kernel vorliegen.
Danke, wenn jemand mal Feedback geben kann und sich der Sache mal
an nimmt.
wollte mal eben ein binary bauen, das nach dem booten eines Linux Kernels
ausgeführt werden soll.
Allerdings scheitert es schon an den kleinen Dingen.
Die Textausgaben stimmen schonmal.
Jetzt möchte ich gerne Dateien schreiben, lesen und anzeigen lassen.
wenn ich den Code unten, mit
gcc -c test01.c -o test01.o
übersetzen will, kommen die merkwürdigsten Meldungen:
test01.c: In function ‘write_file’:
test01.c:30:3: error: unknown type name ‘loff_t’
loff_t pos = 0;
^
test01.c:33:3: error: unknown type name ‘mm_segment_t’
mm_segment_t old_fs = get_fs();
^
test01.c:34:10: error: ‘KERNEL_DS’ undeclared (first use in this function)
set_fs(KERNEL_DS);
^
test01.c:34:10: note: each undeclared identifier is reported only once for each function it appears in
test01.c:36:27: error: ‘O_WRONLY’ undeclared (first use in this function)
fd = sys_open(filename, O_WRONLY|O_CREAT, 0644);
^
test01.c:36:36: error: ‘O_CREAT’ undeclared (first use in this function)
fd = sys_open(filename, O_WRONLY|O_CREAT, 0644);
^
test01.c:38:25: warning: incompatible implicit declaration of built-in function ‘strlen’
sys_write(fd, data, strlen(data));
^
test01.c:39:10: warning: assignment makes pointer from integer without a cast
file = fget(fd);
zweitens: wie kann man verzeichnisse mit kernel funktionen anzeigen lassen?
habe hier einen 4.2.1 linux kernel vorliegen.
Danke, wenn jemand mal Feedback geben kann und sich der Sache mal
an nimmt.
Code:
#define _GNU_SOURCE
#define SYSCALL_EXIT 1
#define SYSCALL_WRITE 4
char hello[] = "Hello World!\n";
/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/syscalls.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <linux/vmalloc.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
*/
int write_file(char *filename, char *data)
{
struct file *file;
loff_t pos = 0;
int fd;
mm_segment_t old_fs = get_fs();
set_fs(KERNEL_DS);
fd = sys_open(filename, O_WRONLY|O_CREAT, 0644);
if (fd >= 0) {
sys_write(fd, data, strlen(data));
file = fget(fd);
if (file) {
vfs_write(file, data, strlen(data), &pos);
fput(file);
}
sys_close(fd);
}
else {
asm("int $0x80" : : "a" (SYSCALL_WRITE), "b" (1), "c" ("plub\n"), "d" (sizeof(5)));
return -1;
}
set_fs(old_fs);
return 0;
}
void _start(void)
{
// sys_write(1, hello, sizeof(hello))
asm("int $0x80" : : "a" (SYSCALL_WRITE), "b" (1), "c" (hello), "d"
(sizeof(hello)));
// sys_exit(0)
//asm("int $0x80" : : "a" (SYSCALL_EXIT), "b" (0));
write_file("/bin/test.txt", "Das sollte hier stehen.");
for (;;);
}