Versuche mein User-Land nun von Assembler auf C umzustellen.
Bitte um Hilfe bezüglich folgender Fehlermeldung:
G:\OSDev\User\65\user\user_program_c>mingw32-make
i586-elf-gcc -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -f
no-builtin program.c -o program.o
c:/crosstools/bin/../lib/gcc/i586-elf/4.4.0/../../../../i586-elf/bin/ld.exe: war
ning: cannot find entry symbol _start; defaulting to 08048054
C:\DOKUME~1\HERRDR~1.HEN\LOKALE~1\Temp\ccENu29C.o: In function `_main':
program.c:(.text+0x16): undefined reference to `_settextcolor'
program.c:(.text+0x22): undefined reference to `_putch'
program.c:(.text+0x2e): undefined reference to `_putch'
program.c:(.text+0x3a): undefined reference to `_putch'
program.c:(.text+0x46): undefined reference to `_putch'
collect2: ld returned 1 exit status
mingw32-make: *** [program.o] Error 1
start.asm
[BITS 32]
extern _main
global _start
_start:
call _main
end:
jmp end
program.c
#include "userlib.h"
int main()
{
settextcolor(4,15);
putch('T');
putch('e');
putch('s');
putch('t');
return 0;
}
userlib.h
#ifndef USERLIB_H
#define USERLIB_H
void settextcolor(unsigned int foreground, unsigned int background);
void putch(unsigned char val);
#endif
userlib.c
#include "userlib.h"
void settextcolor(unsigned int foreground, unsigned int background)
{
asm volatile("mov %0, %%ebx" :: "g"(foreground)); \
asm volatile("mov %0, %%ecx" :: "g"(background)); \
asm volatile("mov $2, %eax"); \
asm volatile("int $0x7F");
}
void putch(unsigned char val)
{
asm volatile("mov %0, %%ebx" :: "g"(val)); \
asm volatile("mov $1, %eax"); \
asm volatile("int $0x7F");
}
makefile
ASFLAGSOBJ= -O32 -f elf
NASM = nasmw
CFLAGS= -Wall -O -ffreestanding -fleading-underscore -nostdlib -nostdinc -fno-builtin
CC= i586-elf-gcc
LDFLAGS= -T user.ld -Map kernel.map -nostdinc
LD= i586-elf-ld
all: program.elf
program.elf: start.o userlib.o program.o
$(LD) $(LDFLAGS) $+ -o $@
userlib.o: userlib.c
$(CC) $(CFLAGS) $< -o $@
program.o: program.c
$(CC) $(CFLAGS) $< -o $@
%.o: %.asm
$(NASM) $(ASFLAGSOBJ) $< -o $@
# $< Erste Abhängigkeit
# $+ Liste aller Abhängigkeiten
# $@ Name des Targets
user.ld
ENTRY(_main)
OUTPUT_FORMAT(elf32-i386)
SECTIONS
{
.text : { *(.text*) }
.data : { *(.data*) }
.rodata : { *(.rodata*) }
.bss : { *(.bss*) }
}
Folgende Dateien werden erzeugt:
start.o
userlib.o
program.o wird nicht erzeugt. Bitte auch die AT&T Syntax checken (da habe ich zwar die Fehlermeldungen weg bekommen, aber sicher bin ich mir da nie).
Habe schon versucht, -fleading-underscore wegzulassen bzw. gegen -fno-leading-underscore auszutauschen, führt aber zur Fehlermeldung wie oben allerdings ohne Underscore vor den Funktionen settextcolor(..., ...) und putch(...). Das ist eines der Dinge, bei denen mir noch der komplette Durchblick fehlt.