2016-08-19 1 views
0

Ich arbeite an einem Cortex-M4 (STM32F4-Discovery-Board) mit der GNU ARM Embedded-Toolchain (gcc-arm-none-eabi-5_4 -2016q2). Der hardwareabhängige Teil meines Codes (HAL-lib, CMSIS, Startup usw.) ist in einer statischen Bibliothek erstellt, die ich mit meinem Anwendungscode verknüpfen möchte. Mein Anwendungscode enthält ein main Symbol und meine Bibliothek enthält ein _sbrk Symbol. Dies sind die Fehlermeldungen:Nicht definierter Verweis auf `main 'und _sbrk - Startcode in der eigenen statischen Bibliothek

engine_control/source/os/release/libkosmos-arm-stm32f4-discovery.a(_startup.o): In function `_start': 
_startup.c:(.after_vectors+0x9a): undefined reference to `main' 

und:

/opt/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-sbrkr.o): In function `_sbrk_r': 
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' 

Ich nehme an, es ist etwas falsch mit meinem Link bestellen. Hier ist mein Link Befehl:

arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Werror -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wconversion -Wpointer-arith -Wpadded -Wshadow -Wlogical-op -Waggregate-return -Wfloat-equal -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"config/linker" --specs=nano.specs -L/home/tkl/git/engine_control/source/os/release -Wl,-Map,"/home/tkl/git/engine_control/release/map/arm/release/.map" -lkosmos-arm-stm32f4-discovery -o "/home/tkl/git/engine_control/release/execute/arm/release/.elf" 

Was mache ich falsch?

+0

Was verknüpfen Sie eigentlich? Wo ist "main" _supposed_ zu sein? Dieser Linkbefehl scheint nur eine Bibliothek und keine Objektdateien zu enthalten ... – Notlikethat

+0

Danke, ja, Sie haben Recht. Ich habe es versäumt, mein Hauptobjekt zu verknüpfen (weil ich leider verschiedene Variablennamen für die Definition von Objekten und die Verwendung von Objekten in meinem Makefile verwendet habe). – user3592527

Antwort

0

Hinweis: Wenn Sie den Startcode in eine Bibliothek stellen, hat der Linker wahrscheinlich keinen guten Grund, ihn einzubinden. Niemand fragt danach, weil normalerweise kein anderer Teil des Codes ihn aufruft Kosten wie Startcode muss in einer Objektdatei während der Verknüpfung sein. Und diese Objektdatei sollte wahrscheinlich zuerst auf Ihrer Verbindungslinie stehen (weil sie normalerweise main und alle anderen Arten von Symbolen aufruft und diese nach in der Verbindungsreihenfolge kommen müssen, um das Symbol richtig aufzulösen).

Die andere ist sbrk_r beschwert über keine Bezugnahme auf sbrk - ich würde davon ausgehen, dass beide in Ihrer Bibliothek sind. Dies kann behoben werden, indem Sie Ihre Bibliothek über ranlib ausführen, um einen korrekten Index zu erstellen.

+1

Echte Neugier: Angenommen, es gibt tatsächlich ein Linker-Skript, das als eine der Eingabedateien übergeben wird, würden explizite Symbolreferenzen in diesem Beispiel (dh der Einstiegspunkt, Ausnahmevektoren usw., die sich wahrscheinlich in diesem Startcode befinden) nicht als Referenzen gezählt die Perspektive der "suchenden Bibliotheken"? – Notlikethat

+1

Wenn Sie dem Linker mitteilen, dass Sie ein bestimmtes Symbol an einer bestimmten Adresse haben möchten, dann yes. Aber das OP hat uns nicht vorgestellt. Wenn es im Linkerskript nicht viel mehr als Segmentnamen und die Adressen gibt, die Sie haben wollen (perfekt gültig, wenn Sie versuchen, ein generisches zu verwenden, und was ich normalerweise tue), dann nein. – tofro

+0

Und wenn der Startcode aus mehreren Objekten besteht, finde ich teilweise Linking sehr praktisch. –

Verwandte Themen