Gcc Linker cannot find entry symbol

OP #6260373
Hallo,

ich habe eine kleine Library (.a) gebaut, in der es eine Funktion 
ISR_RESET gibt (definiert im .cpp File, deklariert im .hpp). Wenn ich 
diese .a-Library nun zu einem anderen Projekt dazulinke und als 
Entrypoint im Linkerscript nun diese ISR_RESET angebe, so sagt der 
Linker:

warning: cannot find entry symbol ISR_RESET; not setting start address

Die Funktion ist aber definitiv im Headerfile deklariert, ich könnte sie 
zum Beispiel auch aus main heraus aufrufen.
Warum kommt dieser Fehler?

Grüße
Leopold N. schrieb:
> ISR_RESET gibt (definiert im .cpp File, deklariert im .hpp)

Für C++ bekommt der Namen noch eine "Dekoration" für die Parameter, 
daher findet der Linker das Symbol nicht.

Abhilfe ist: extern "C" { }

Damit wird das Symbol C-konform deklariert.

Und ja, die Compiler schalten automagisch in C++ Modus wenn die Source 
Datei eine .cpp Endung trägt.
Persönliche Seite
Du musst den mangled Name bzw. Assembler-Name der Funktion angeben.  Wie 
der genau ist hängt von der Linkage ab.

Weiterhin:

1) Das Symbol muss externally visible sein (insbesondere also global).

2) Es muss ein Symbol sein.  Bezeichner wie "ISR_RESET" bezeichnen 
üblicherweise Makros.  Wenn dem so ist musst du natürlich den wirlichen 
Name der Funktion verwenden.

3) Der Assembler-Name kann sich selbst bei C ein andere sein als Der 
Funktionsname, z.B. wie bei x86 üblichem Leading Underscore.
Aber noch zwei kurze Anmerkungen:

Leopold N. schrieb:
> Die Funktion ist aber definitiv im Headerfile deklariert, ich könnte sie
> zum Beispiel auch aus main heraus aufrufen.

Dem Linker ist der Header völlig egal.

Im Übrigen hattest du mit nm oder objdump nachschauen können, was für 
Symbole sich in deinem Archiv so finden.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.