www.mikrocontroller.net

Forum: Compiler & IDEs Compiler verändert funktionsnamen


Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich wunder mich nun schon seit einiger zeit über einen Linker Error
>>[Linker error] undefined reference to `testme(char)'
zu den quellcode

>>extern void testme(char c);
>>int main(void)
>>{
>>    testme('L');
>>    return 0;
>>}

und der externen asm file s.S

>>.global testme
>>.func testme
>>testme:
>>mov r16,r24
>>ret
>>.endfunc
>>.end

(eingebunden in ASRC=s.S der Makefile)

mit avr-nm bekam ich
>>         U __do_clear_bss
>>         U __do_copy_data
>>0000003e a __SP_H__
>>0000003d a __SP_L__
>>0000003f a __SREG__
>>00000000 a __tmp_reg__
>>00000001 a __zero_reg__
>>         U _Z6testmec
>>00000000 T main
und sah mit erstaunen das der compiler mir aus der funktion testme die 
funktion
>_Z6testmec
macht. Als ich die s.S dementsprechend änderte war alles schön und supi.
nun möchte ich aber das die C funktion beim compilieren ihren namen 
behält,  und ich weiß leider nicht wie ich das anstelle.
Danke für eure Aufmerksamkeit.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> und sah mit erstaunen

Das ist nicht ungewöhnlich und nennt sich 'Name-mangling'.
Das Problem tritt immer dann auf, wenn dein System (compiler
+linker) auch Sprachen wie C++ unterstützt, in der 2 Funktionen
den gleichen Namen haben dürfen solange sie sich in der
Argumentliste unterscheiden.
Da bleibt dann dem System nichts anderes übrig als den
Funktionsnamen mit den Datentypen in der Argumentliste zu
dekorieren um zumindest intern eine Unterscheidung zu erhalten.

Aber du kannst mal versuchen ob

extern "C" void testme(char c);

das Problem löst.

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort,..
die Variante mit extern "c".. funktioniert,..

Es gibt auch noch eine möglichkeit,..(habe ganz schön lang gesucht)
>>(siehe 
http://developer.apple.com/documentation/developer...)

>extern void testme(char c) asm ("testme");
funktioniert auch,..

grüüüße und dank
der kai

Autor: Regler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum ist das denn ein Problem, wenn der Compiler den Namen ändert?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler betrachet in schönster Unix-Konvention Dateien, die auf 
".C" enden, als C++-Quellen. Wenn's C sein soll, dann ist ".c" besser.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell hilft auch der Schalter -xc


Peter

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Regler

>Warum ist das denn ein Problem, wenn der Compiler den Namen ändert?

siehe Originalposting

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.