Forum: Compiler & IDEs Makefile um Linkeraufruf erweitern


von Michael J. (jogibaer)


Angehängte Dateien:

Lesenswert?

Hallo,

für ein Projekt muß ich die Startadresse des Programms verschieben.
Dazu muß ich mein Makefile um den Linkeraufruf erweitern.
(Die vermutlichen Optionen habe ich schon eingesetzt)

Würde mir bitte jemand mal freundlicherweise sagen, was ich wo noch
eintragen muß ?

Im Anhang mal das Makefile.

PS:

Ich hatte schon überlegt ein anderes Makefile zu nehmen, aber mit diesem
hatte ich bisher keine Probleme und ich habe mich dran "gewöhnt"


Jogibär

von Stefan B. (stefan) Benutzerseite


Lesenswert?

In dieser Zeile deines makefiles:

$(CC) $(CFLAGS) -o $(NAME).out -Wl,-Map,$(NAME).map main.o

sehe ich deine sorgfältig gesetzten LDFLAGS nicht

LDFLAGS=-Wl,-Map=$(NAME).map,--cref,--section-start=.flashloader=$(START 
_ADR)  --mmcu=$(MCU)

bzw. sehe ich einen Teil davon explizit ausformuliert.

Man könnte obige Zeile mal so probieren (kann's derzeit nicht testen):

$(CC) $(CFLAGS) -o $(NAME).out $(LDFLAGS) main.o

von Michael J. (jogibaer)


Lesenswert?

Hallo,

ich habe auch nie behauptet, "sorgfältig" gesetzte LDFLAGS zu benutzen 
;-).

Das Thema ist für mich neu, daher frage ich mal nach.

Ich habe mal Deinen Vorschlag ausprobiert; ich bekomme wenigstens keine
Fehlermeldung.
Allerding sieht die Hexdatei nicht gerade erfolgsversprechend aus:

:1000000012C02BC02AC029C028C027C026C025C0C6
:1000100024C023C022C021C020C01FC01EC01DC0DC
:100020001CC01BC01AC011241FBECFE5D4E0DEBF28
:10003000CDBF10E0A0E6B0E0E2E7F0E002C005903E
:100040000D92A036B107D9F710E0A0E6B0E001C0EC
:100050001D92A036B107E1F701C0D2CFCFE5D4E0C1
:10006000DEBFCDBF8FEF84BB85BB80E090E000C0DA
:02007000FFCFC0
:00000001FF

In der ersten Zeile bin ich immer noch bei Adresse 0;

Ich habe Deinen Vorschlag mal an diese Position  eingesetzt:

$(NAME).hex : $(NAME).out
  $(CC) $(CFLAGS) -o $(NAME).out $(LDFLAGS) main.o
  $(OBJCOPY) -R .eeprom -O ihex $(NAME).out $(NAME).hex


Ist das überhaupt richtig ?

Hoppla,

ich schreibe einfach mal weiter

Ich habe mal in den Optionen .flashloader durch .text ersetzt.
Dadurch erhalte ich folgendes:

:1018000012C02BC02AC029C028C027C026C025C0AE
:1018100024C023C022C021C020C01FC01EC01DC0C4
:101820001CC01BC01AC011241FBECFE5D4E0DEBF10
:10183000CDBF10E0A0E6B0E0E2E7F8E102C005901D
:101840000D92A036B107D9F710E0A0E6B0E001C0D4
:101850001D92A036B107E1F701C0D2CFCFE5D4E0A9
:10186000DEBFCDBF8FEF84BB85BB80E090E000C0C2
:02187000FFCFA8
:0400000300001800E1
:00000001FF

Das sieht doch schon erheblich besser aus.
Ist die Option flashloader für ein eventuell nachträglich aufgerufenes
Flashprogramm ?

Der normale Code ist doch nur text, oder ?


Jogibär

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Ist die Option flashloader für ein eventuell nachträglich aufgerufenes
> Flashprogramm ?

Nee, für einen vorher aufgerufenen Bootloader. Das steht jedenfalls als 
Kommentar im makefile. Der Bootloader soll das Flash füllen und liegt 
selbst im Flash ab der angegebenen Adresse. Damit er arbeiten kann, muss 
die entsprechende Fuse gesetzt sein.

Das HEX-File zu analysieren ist mutig. Ich würde das MAP-File anschauen 
bzw. mir ein Listing ausgeben lassen.

> Der normale Code ist doch nur text, oder ?

.text und .data. .data ist aber relativ zu .text angegeben. Näheres bei 
den Linkercontrolscripts in <winavr>\avr\lib\ldscripts dort avr4.x für 
die Atmega8 und normale Programme

Bist du sicher mit dem Verlagern deines Programms an eine andere 
Startadresse? Was hast du mit dem Startupcode der C-Library und den 
Vektoren für die Interrupts geplant?

von Michael J. (jogibaer)


Lesenswert?

Hallo,

danke für Deine Antwort.

Das Programm soll in den Bootloader Bereich des ATMega.

Mit den Interrupts habe ich keine Probleme, ich nutze diese nämlich 
nicht.

Was Du mit dem Startupcode meinst, ist mir etwas unklar.
Der wird ja vom GCC eingefügt und setz am Anfang Stack und ähnliches.
Auf diesen habe ich doch vom C Programm gar keinen Einfluß.
Das der natürlich auf die geänderte Startadresse angepaßt werden muß
ist mir eigentlich klar.
Bei Assembler hatte man dazu direkt den .org Befehl.
Soweit ich dies gelesen habe, muß man bei C dem Linker die geänderte
Startadresse mitteilen, und der kümmert sich dann um den Rest.

Ich habe mal bei einem Bootloaderproggramm geschaut, da steht in den C 
Dateien auch nichts bezüglich der Startadresse.
Dort wird es auch über den Linker erledigt.

Jogibär

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.