Forum: Mikrocontroller und Digitale Elektronik Gcc Linker cannot find entry symbol


von Leopold N. (leo_n)


Lesenswert?

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

von Leopold N. (leo_n)


Lesenswert?

Selbst wenn ich in main.cpp die Funktion ISR_RESET definiere, kommt die 
Fehlermeldung. Nehme ich aber main als EntryPoint (also auch im 
Linkerscript) dann geht es. Der Unterschied liegt somit doch nur im 
Namen.

von Jim M. (turboj)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Leopold N. (leo_n)


Lesenswert?

Vielen Dank,
Name Mangling... ich komm mir vor wie n Anfänger...
Hab den ganzen Tag damit verplempert.
Extern C hat alles geregelt...

Grüße

von Rolf M. (rmagnus)


Lesenswert?

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.

von Leopold N. (leo_n)


Lesenswert?

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

Gut zu wissen, danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.