Hi, ich brauch hilfe ... ich linke ein compiliertes modul zu einem bereits bestehendem projekt hinzu und das gesamte programm macht nichtmehr was es machen soll, ob wohl ersteinmal testweise überhaupt kein aufruf der funktionen in dem neu hinzugefügten modul aus dem programm vorhanden sind ( auch keine IRQ in dem neuen Modul). was ist dort schief gelaufen ?? ich mein eig. dürfte der code des neuen moduls ja nie ausgeführt werden wenn ich ihn nicht aus dem programm aufrufe oder ?? _ atmega2561 mit avr gcc
Naja, wenn Du z.B. globale Variabeln mit gleichem Namen hast, dann denkt sich der Linker sicher, dass es wohl dasselbe ist und verweist auf denselben Speicherplatz... Mann muss bei solchen Spässen schon wissen was man tut.
hmm, naja solange ich nicht mit extern ***** draufzugreife dürfte ich doch sogar gleiche Var.-bezeichner verwenden können ... der gültigkeitsbereich beschränkt ishc doch immer auf die Quellcodedatei bzw. dann das Objekt ... na ich kontrollier mal ... vielleicht find ich ja was doppeltes
>der gültigkeitsbereich beschränkt ishc doch immer auf die >Quellcodedatei bzw. dann das Objekt ... Nur wenn diese Variablen als 'static' deklariert wurden. Das Schlüsselwort 'extern' dient nur zur Information des Compilers das es so eine Variable gibt. Alles andere macht der Linker. Der fasst globale Objekte mit gleichen Namen zu einem zusammen. Das mag aber auch vom verwendeten Compiler abhängen. Ich meine mal gelesen zu haben das sich Windows-compiler bei diesen 'multiple commons' anders verhalten. Der gcc ist kein solcher Compiler.
also hab gerad mal kontrolliert : alle Variablendeklarationen außerhalb der funktionen sind mit static deklariert!!
Wenn das neue Modul tatsächlich nicht benutzt wird dürfte der Linker es erst gar nicht zum Binary linken. Du könntest mal versuchen -ffunction-sections und -fdata-sections dem Compiler und -gc-sections dem Linker als Optionen zu geben. Dann wird alles was nicht gebraucht wird rausgeschmissen. Wenn sich die Größe des Binaries dennoch erhöht kannst du noch -Wl,-Map=target.map,--cref den LDFLAGS hinzufügen (falls nicht schon der Fall). Dann im Mapfile (target.map) unter 'Cross Reference Table' nachsehen welche Funktion/Variable von welchem Modul verwendet wird. Vielleicht findest du dort einige Ungereimtheiten.
jojo , danke schonmal ... aber geht trotzdem noch nicht ... also in dem C-Ref.-Tab. steht hinter den Funktionen des moduls auch nur dieses modul-Objekt ... also müsste keine externer code die funktionen aufrufen ... trotz den neuen comp./linker -options stehen aber weiterhin diese funktionen in der map-datei...
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.