Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: ehenkes am 04. July 2009, 21:20
-
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.
-
In Zweifelsfall einfach mal mit objdump anschauen, welche Symbole er dir tatsächlich reingebaut hat. Ein ELF-gcc macht standardmäßig keine Unterstriche rein und die entsprechenden Optionen funktionieren meiner Erfahrung nach gerade im Zusammenspiel mit Windows nur manchmal.
Dein mehrzeiliger Assemblercode sieht auch falsch aus. Das sollte ein einziger mehrzeiliger String in einem einzigen asm() sein.
-
Dein mehrzeiliger Assemblercode sieht auch falsch aus. Das sollte ein einziger mehrzeiliger String in einem einzigen asm() sein.
Das geht beides.
Freilich kannst du beides hinschreiben und es ist auch beides syntaktisch korrekt. Aber verlass dich lieber nicht darauf, dass es gleichbedeutend ist. Es garantiert dir kein Mensch, dass die Registerinhalte in der nächsten asm-Anweisung noch dieselben sind.