crt0 in statischer Lib

Gast #1391523
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
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
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
...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
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
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
> 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.