Forum: Compiler & IDEs crt0 in statischer Lib


von Malte R. (Gast)


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.

von Joe D. (kosmonaut_pirx)


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ß

von Malte R. (Gast)


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 ?

von Joe D. (kosmonaut_pirx)


Lesenswert?

hm. poste bitte compiler-aufruf samt output. und/oder makefile

von Malte R. (Gast)


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!?!?).

von Martin T. (mthomas) (Moderator) Benutzerseite


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

von Malte R. (Gast)


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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Malte R. (Gast)


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.

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.