Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 03. June 2008, 12:42

Titel: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: Cheebi 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
Titel: Re: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: RedEagle 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?
Titel: Re: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: bluecode am 03. June 2008, 15:11
Versuch mal -fno-stack-protector beim Compilieren und jo, soviel Code ist schon ein bisschen übertrieben :-)
Titel: Re: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: Termite 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;
}

Titel: Re: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: RedEagle 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 :)
Titel: Re: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: Cheebi 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
Titel: Re: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: bluecode 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:
Titel: Re: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: nooooooooos am 05. June 2008, 16:01
In diesem Falle: "Experience macht einen profesionelen C-Code..."

Gruss
Titel: Re: ___stack_chk_fail was fehlt ld an der stelle?
Beitrag von: bluecode am 05. June 2008, 16:45
In diesem Falle: "Experience macht einen profesionelen C-Code..."
Ich rede aber von "Montagearbeitern" (http://dict.leo.org/ende?lp=ende&lang=de&searchLoc=0&cmpType=relaxed&sectHdr=on&spellToler=on&chinese=both&pinyin=diacritic&search=assembler&relink=on). :mrgreen: