Autor Thema: undefined reference to ...  (Gelesen 2293 mal)

ehenkes

  • Gast
Gespeichert
« am: 04. July 2009, 21:20 »
Versuche mein User-Land nun von Assembler auf C umzustellen.
Bitte um Hilfe bezüglich folgender Fehlermeldung:
Zitat
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.
« Letzte Änderung: 04. July 2009, 21:26 von ehenkes »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 04. July 2009, 21:32 »
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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 04. July 2009, 23:15 »
Zitat
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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen