www.mikrocontroller.net

Forum: Compiler & IDEs crt0 in statischer Lib


Autor: Malte R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich versuche grad ein crt0 Projektunabhängig (gleiche Platform) in eine 
statische Lib. zu packen. Das crt0 ist in der Lib. auch vorhanden, nur 
erzählt mir der Linker das er das Symbol _startup nicht finden kann 
(_startup ist der Einstiegspunkt und sollte nach Adresse 0 gelinkt 
werden). Wenn ich das crt0 wieder ins Projekt packe dann funktioniert es 
problemlos.

Ich versteh es nicht. Kennt jemand eine Erklärung ???


Compiler: gcc version 4.3.3 (Sourcery G++ Lite 2009q1-161)


Grüße.

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
wird die lib auch wirklich dazu gelinkt?

wenn ja, schau mal in die lib rein, wie das symbol dort genannt wird 
(objdump, readelf, ...). vielleicht ist das mangling da anders, wer 
weiß.
gruß

Autor: Malte R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also:

### in der Objektdatei:

  4 .vectors      00000044  00000000  00000000  000000c8  2**2
                  CONTENTS, RELOC, READONLY

00000000 g       .vectors       00000000 _startup

### in der staischen Lib:

  4 .vectors      00000044  00000000  00000000  000000c8  2**2
                  CONTENTS, RELOC, READONLY

00000000 g       .vectors       00000000 _startup


Kommt der evtl. nicht mit der Section .vectors klar ?

Autor: Joe Die (kosmonaut_pirx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm. poste bitte compiler-aufruf samt output. und/oder makefile

Autor: Malte R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Compiler:

arm-none-eabi-gcc -Wall -g -Os -msoft-float -mcpu=arm7tdmi -march=armv4t 
-nostartfiles -Trom.ld  -o at91sam7s256.elf main.o ../rt/kernel/kernel.a 
../rt/lib/lib.a

/arm-2009q1/bin/../lib/gcc/arm-none-eabi/4.3.3/../../../../arm-none-eabi 
/bin/ld:  warning: cannot find entry symbol _startup; defaulting to 
00000000

Mapfile:

ENTRY(_startup)

SECTIONS
{
.....


Sobald sich die Objektdatei in der statischen Lib. befindet und das 
Symbol im Code nicht verwendet wird scheint es beim bearbeiten der Map 
Datei nicht mehr da zu sein (wechoptimiert!?!?).

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

Bewertung
0 lesenswert
nicht lesenswert
...sowie Linkerskript und Quellcode von crt0. Am besten einfach ein 
komplettes Miniprojekt, auf das man ein "make all" loslassen kann um den 
Fehler nachzuvollziehen. Ansatzpunkte: Link-Reihenfolge, unused-code 
removal (function-section,gc-sections) ausschalten falls an, 
ENTRY-Eintrag im Linkerscript, ebenfalls Linkerskript: KEEP für alle 
Elemente in crt0-Objektdatei, eigene Section für Startup-Code und diesen 
per KEEP sichern

Autor: Malte R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das Abschalten von "unused-code removal" hat nichts gebracht. Der 
ENTRY-Eintrag war ja schon drin und KEEP bringt auch nichts. Einzig ein:

void * __attribute__((used)) _startup;

in einer Header-Datei hat es dann gebracht.


Danke!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Bibliothek wird ja nur benutzt, um Symbole aufzulösen, die zu
dem Zeitpunkt global undefined sind.  Je nachdem, wann nun das
Symbol _startup intern als undefined generiert wird, ist zu diesem
Zeitpunkt die Bearbeitung dieser Bibliothek vielleicht schon
abgeschlossen.

Du könntest ein Symbol, das nur in deiner crt0.o-Modul vorkommt,
auf der Kommandozeile von vornherein als undef eintragen.  Das
geht mit der Option -u (vom Compiler aus: -Wl,-u).

Normalerweise muss crt0.o der allererste Modul sein, der gelinkt
wird.  In der üblichen Linkerreihenfolge kümmert sich der Compiler
darum.  In deinem Fall müsste man wahrscheinlich die Bibliothek
erst einmal vor allen anderen Objektmodulen angeben, damit crt0.o
von dort gelinkt wird, danach die Objektmodule der Applikation, am
Ende die Bibliothek nochmal, um die offenen Referenzen der Applikation
aufzulösen.

Wirklichen Sinn sehe ich allerdings nicht in dieser Vorgehensweise.
Ist doch viel komplizierter, als den crt0.o-Modul explizit (und
ohne Bibliothek) anzugeben.

Autor: Malte R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wirklichen Sinn sehe ich allerdings nicht in dieser Vorgehensweise.
> Ist doch viel komplizierter, als den crt0.o-Modul explizit (und
> ohne Bibliothek) anzugeben.

Das ist richtig. Ich finde es aber eleganter nur gegen eine Lib. zu 
Linken und nicht noch tausend andere Files und deren Abhängigkeiten, die 
ich nach 4 Wochen wieder vergessen habe ;-)

Anders könnte man es machen, indem das Makefile der Lib. die Linkerflags 
vom Projekt um die fehlenden Einträge erweitert bzw. erstmal 
initialisiert. Aber das ist noch nicht ganz zu Ende gedacht ...


Grüße.

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.