crt0 in statischer Lib

Gast #1391523
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.
Gast #1391558
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 ?
Gast #1391588
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!?!?).
Moderator Persönliche Seite #1391599
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
Gast #1391619
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!
Moderator Persönliche Seite #1391627
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.
Gast #1391652
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren