[C] ld: undefined reference to `__alloca' bzw. `___main'

Jellysheep

Erfahrenes Mitglied
Hi,
folgendes Programm:
C:
//ckernel.c
int main()
{
    return 0;
}
kompiliert mit
Code:
gcc -c ckernel.c -o ckernel.o
und gelinkt mit
Code:
ld -T kernel.ld kernel.o ckernel.o -o ckernel.bin
gibt folgenden Fehler von "ld":
Code:
ckernel.o:ckernel.c:(.text+0x21): undefined reference to `__alloca
ckernel.o:ckernel.c:(.text+0x26): undefined reference to `___main'
Wenn ich "main" durch "_main" ersetze, funktioniert es. :eek:
Aber in vielen Tutorials steht nur "main" drin, wieso geht es bei mir nicht? :(
Ich hoffe, ihr könnt mir helfen.
 
Linkerskript:
Code:
OUTPUT_FORMAT("binary")
ENTRY(RealMode)
SECTIONS
{
  .text 0x8000 : { *(.text) }
  .data        : { *(.data) }
  .bss         : { *(.bss)  }
}
In kernel.o sind mehrere Symbole definiert, u.a. RealMode, dabei _main als extern, aber kein __alloca oder ___main.
 
Auf meinem System funktioniert das ohne Probleme:
Code:
$ cat kernel.c 
extern int main();
void RealMode() {main();}
$ cat ckernel.c
int main() { return 0; }
$ gcc -c kernel.c -o kernel.o
$ gcc -c ckernel.c -o ckernel.o
$ nm kernel.o
0000000000000000 T RealMode
                 U main
$ nm ckernel.o 
0000000000000000 T main
$ cat kernel.ld 
OUTPUT_FORMAT("binary")
ENTRY(RealMode)
SECTIONS
{
  .text 0x8000 : { *(.text) }
  .data        : { *(.data) }
  .bss         : { *(.bss)  }
}
$ ld -T kernel.ld kernel.o ckernel.o -o ckernel.bin
$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303
Copyright 2009 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.
Was passiert bei dir, wenn du diese Kommandos eingibst? Die kernel.c gibt es bei dir vermutlich nicht, aber die Ausgabe von nm kernel.o wäre trotzdem interessant.

Grüße,
Matthias
 
Danke dir für deine Hilfe, Matthias! :)
Evlt. habe ich vergessen zu erwähnen, dass ich Windows mit DJGPP nutze. :-(
Jedenfalls funktioniert es jetzt, ich habe den Fehler gefunden:
Als Compiler habe ich "gcc" von MinGW genutzt, und als Linker "ld" von DJGPP. Das hat wohl nicht geklappt. :rolleyes:
Falls du die Ausgabe von nm kernel.o von deiner kernel.c noch haben möchtest:
Code:
00000000 b .bss
00000000 N .comment
00000000 d .data
00000000 t .text
00000000 T _RealMode
         U _main
Irgendwie anders als deine... :D
 
Zurück