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.
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ß
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 ?
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!?!?).
...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
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!
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.