Autor Thema: ___stack_chk_fail was fehlt ld an der stelle?  (Gelesen 8355 mal)

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« am: 03. June 2008, 12:42 »
hallo,

nachdem ich's jetzt geschafft habe, dass gcc meinen code auch unter linux übersetzt steh ich jetzt noch vor einem letzten problem beim linken der objektdateien:
folgender code erzeugt nachfolgenden fehler:
void PrintHexNumber(ulong ulNumber, ulong ulColor)
{
  char c = 0;
  char acNumber[10];

  for ( ; c < 8; c++ )
  {
    acNumber[c] = ulNumber & 0xf;
    ulNumber >>= 4;
  }
  acNumber[c++] = 'x';
  acNumber[c] = 0;
  for ( ; c >= 0; c-- )
  {
    switch (acNumber[c])
    {
      case 'x' : PrintChar('x', ulColor); break;
      case 15  : PrintChar('f', ulColor); break;
      case 14  : PrintChar('e', ulColor); break;
      case 13  : PrintChar('d', ulColor); break;
      case 12  : PrintChar('c', ulColor); break;
      case 11  : PrintChar('b', ulColor); break;
      case 10  : PrintChar('a', ulColor); break;
      case 9   : PrintChar('9', ulColor); break;
      case 8   : PrintChar('8', ulColor); break;
      case 7   : PrintChar('7', ulColor); break;
      case 6   : PrintChar('6', ulColor); break;
      case 5   : PrintChar('5', ulColor); break;
      case 4   : PrintChar('4', ulColor); break;
      case 3   : PrintChar('3', ulColor); break;
      case 2   : PrintChar('2', ulColor); break;
      case 1   : PrintChar('1', ulColor); break;
      case 0   : PrintChar('0', ulColor); break;
      default  : PrintChar('-', ulColor); break;
    }
  }
}

fehler:
ld -m elf_i386 -T link.ld -o kernel.sys
video.o: In function `_PrintHexNumber':
video.c:(.text+0x3327): undefined reference to `___stack_chk_fail'

grüße

Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #1 am: 03. June 2008, 13:57 »
 :-o Soo viel code, nur um ne hexzahl auszugeben, oder verstehe ich den code falsch?

So, kannst du das switch-case - gedöns spaaren ;)
char c;
PrintChar('0', ulColor);
PrintChar('x', ulColor);
for ( ; c < 8; c++ )
  {
    c = (ulNumber & 0xf) >> 28;
    if(c>9) PrintChar(c-10+'A', ulColor); //bzw 'a'
    else    PrintChar(c+'0', ulColor);
    ulNumber <<= 4;
  }

Aber zum eigentlichen Problem:
Ich habe zwar noch nie so ein Fehler gehabt, aber es scheint so, als würde der Compiler da irgendetwas am code ergänzen. Und zwar irgendetwas, was mit dem Stack, bzw dessen schutz zu tun hat. (___stack_chk_fail)
Wie Compilierst du die Datei?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 03. June 2008, 15:11 »
Versuch mal -fno-stack-protector beim Compilieren und jo, soviel Code ist schon ein bisschen übertrieben :-)
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Termite

  • Beiträge: 239
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 03. June 2008, 18:00 »
@ ReadEagle

hast du den code mal ausprobiert? ich würde sagen, der hat noch 2 3 Fehlerchen.

1. char c wird doppelt verwendet ( Laufvariable und temp )
2. char c wird in der for schleife nicht innitallisiert ( unschön )
3. c = (ulNumber & 0xf) >> 28; wird wohl immer 0 werden, wenn ich nicht total daneben liege

für die Ausgabe von Hex zeichen verwend ich normalerweise eine art lookup table.

const char []  HEX  = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

for ( i = 0; i < 8; i++ )
{
   c = ( ulNumber >> 28) & 0x0F;
   PrintChar(HEX[c], , ulColor);
   ulNumber <<= 4;
}


RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 am: 03. June 2008, 18:05 »
Ich habe das nur aus den schnipseln des originals zusammenkopiert ;)
Hier was richtiges:
char c,chr;
PrintChar('0', ulColor);
PrintChar('x', ulColor);
for (c=0 ; c < 8; c++ )
  {
    chr = (char)(ulNumber >> 28)&15;
    if(chr>9) PrintChar(chr-10+'A', ulColor); //bzw 'a'
    else    PrintChar(chr+'0', ulColor);
    ulNumber <<= 4;
  }

Ein array geht natürlich auch - ist wahrscheinlich sogar schneller :)

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #5 am: 04. June 2008, 00:58 »
oh mann... sry, dass ich zu doof war, mir ein wenig einfacheren code einfallen zu lassen   :roll:
Versuch mal -fno-stack-protector beim Compilieren und jo, soviel Code ist schon ein bisschen übertrieben :-)
danke, vielen dank! damit klappts.. so, muss jetzt aber ins bett...

gute nach

Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #6 am: 04. June 2008, 13:51 »
oh mann... sry, dass ich zu doof war, mir ein wenig einfacheren code einfallen zu lassen   :roll:
"Experience macht einen guten Assembler" oder so :-D :mrgreen:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 05. June 2008, 16:01 »
In diesem Falle: "Experience macht einen profesionelen C-Code..."

Gruss

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #8 am: 05. June 2008, 16:45 »
In diesem Falle: "Experience macht einen profesionelen C-Code..."
Ich rede aber von "Montagearbeitern". :mrgreen:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

 

Einloggen