www.mikrocontroller.net

Forum: Compiler & IDEs Linken vor-gelinkter Bestandteile und __do_copy_data


Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich möchte verschiedene Quelldateien je nach Funktion zusammenfassen und
die enstandenen Pakete wiederrum gegeneinander linken. Häufig ändert 
sich nur das main(), der Rest bleibt schlicht gleich. Also wie eine 
Library, wenn man so will. Gegen die möchte ich dann den 
anwendungsspezifischen Code linken.

Linken tue ich die "library" mit dem avr-ld, aufruf:

avr-ld -Map=c.map -o c.elf <die ganzen Object-Files> 
--defsym=__heap_end=0x0 -L <Pfad zum avr-gcc und avr-libc> -lgcc -lc

ok.
Verdammt unschick finde ich das leidige Symbol "heap_end". das wird in 
der c-runtime definiert, wenn ich mich recht entsinne. Auch wenn ich 
nichts mit malloc am hut habe, ok. Binde ich aber die crtXX ein, hab' 
ich gleich den ganzen Sack voll Startup-Symbole wie u.a. auch 
"__do_copy_data" am hals. und ausführbaren code will ich ja noch nicht.

afag.
Linke tue ich das entstandene .elf mit meiner main.o wie folgt:

avr-gcc -mmcu=at90can128 -I. -D GCC_MEGA_AVR -I. -I../../Source/include 
-I../Common/include -g -Os -funsigned-char -funsigned-bitfields 
-fpack-struct -fshort-enums -Wall -Wextra -Wshadow -Wpointer-arith 
-Wcast-align -Wsign-compare -Waggregate-return -Wunused 
-Wa,-adhlns=c/c.o -I<die ganzen include-Dirs> c.elf main.o --output 
co.elf -Wl,-Map=co.map,--cref,--section-start=.text=0x0000

Spätestens jetzt beschwert sich der Linker über ein mehrfach definiertes
"__do_copy_data". Das hat er sich aus der libgcc.a schon zum bauen des 
ersten Pakets (c.elf) geholt. und will das jetzt noch einmal beim Linken 
zum Executable reinpfrimeln. Die libgcc muss ich aber dank "udivmodh14" 
und konsorten mit einbinden.

Was kann ich tun? Die libgcc.a kann ich nicht weg lassen, funkt mir aber 
durch ihr(e) symbol(e) dazwischen. Besteht die Möglichkeit, dem Linker 
zu sagen, dass er zum bauen des ersten Pakets doch bitte schön auf die 
Initialisierung des Datenbereichs verzichten kann?

danke für eure hilfe,
ich hoffe, es kam halbwegens verständlich rüber, andernfalls bescheid 
geben, und ich versuch's noch einmal,
bye kosmo

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum keine "richtige" Library (.a) also in der Art
avr-ar rcs libxyz.a a.obj b.obj c.obj ...
und linken mit
... -L<pfad to libxyz.a> -lxyz ...

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, das ist eigentlich nicht das, was mir vor schwebte. werde ich mir 
aber anschauen.
danke,
bye kosmo

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hm, das ist eigentlich nicht das, was mir vor schwebte.

Du nennst es doch schon selber "library". "Vorgelinkte", unveränderliche 
Programmfunktionen in einem Paket. Genau dafür gibt es die libxxx.a.

Oliver

Autor: kosmonaut_pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin,
das argument akzeptiere ich.

trotzdem bleibt für mich die frage: warum wird code, der meines 
erachtens nach aussschliesslich für die ausführung gedacht ist (eben das 
copy-data), in ein linkable file hinein gelinkt?
möglicherweise habe ich da aber auch etwas nicht verstanden. der linker 
löst erst einmal symbole auf (abstrakte namen  auf konkrete adressen, 
wie es so schön heißt) und relokiert (zumeist). ausführbarer code 
entsteht, wenn eben derartige routinen (c-runtime) mit verwendet werden.

vll kann mir da jemand noch einmal auf die sprünge helfen.

danke vielmals,
bye kosmo

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.