Forum: Compiler & IDEs libgcc Funktion ersetzen


von 3333 (Gast)


Lesenswert?

Hallo,

ich habe bisher mit GCC 3.4 gearbeitet (Nios II). In meinem System habe 
ich einen Koprozessor, der Double +-*/ rechnet.

Um diesen einzubinden, habe ich einen Treiber geschrieben, der die 
selben Funktionsnamen wie in der libgcc verwendet (z.b. double __adddf3 
(double, double);). Das hat dann dazu geführt, dass der Linker die 
lokale (von mir geschriebene) Funktion benutzt hat anstatt der 
libgcc-Softwarefloat-Routine.

Jetzt bin ich gezwungen, meine Toolchain auf GCC 4.1 umzustellen. Leider 
scheint der Linker dort die lokale Funktion nicht mehr einzubinden und 
verwendet ausschliesslich die in der libgcc hinterlegte. Selbst ein 
direkter Aufruf von __adddf3() ruft die falsche Funktion auf.
Nur wenn ich die Funktion umbenenne kann ich sie überhaupt aufrufen, 
jedoch wird dann a = b + c; leider nicht mehr automatisch ersetzt wie 
bislang.

Nachdem ich jetzt nach einem Tag suchen und probieren nicht weiterkomme, 
hoffe ich dass mir von euch jemand ein paar Hinweise dazu geben kann!

von hp-freund (Gast)


Lesenswert?

[Ohne Garantie]

ich würde meine Funktionen in eine lib packen und dem gcc als letztes 
übergeben.

gcc ......... -lgcc -lmymath


[/Ohne Garantie]

von Andreas B. (andreas_b77)


Lesenswert?

Eventuell hilft die Option -nostdlib. Dann musst du zwar die libgcc.a 
manuell mit -lgcc dazulinken, aber das sollte dann wirklich wie eine 
normale Library funktionieren. Ich glaube, der aktuelle gcc umgeht für 
interne und Standard-C Bibliotheksfunktionen die normalen Wege und 
verarbeitet die Aufrufe direkt, um besser zu optimieren.

von ... (Gast)


Lesenswert?

..und in C++ wärs so schön einfach...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

... schrieb:
> ..und in C++ wärs so schön einfach...

Mit C++ ist's der absolute Krampf.  Beispiel: Ein nicht-POD in den Flash 
legen als Lookup-Tabelle.

Viel Spaß.

von 3333 (Gast)


Lesenswert?

Die Option mit -nostdlib habe ich ausprobiert, hat aber nicht geholfen. 
Gestern habe ich im Laufe des Tages die source-Datei mit dem Treiber von 
.c nach .cpp umbenannt. Nachdem ich sie heute wieder zurück in .c 
benannt habe, funktioniert das ganze jetzt wie gewünscht.
Warum das jetzt allerdings ein Problem war, kann ich nicht 
nachvollziehen. Im Makefile war die Datei immer korrekt mit drin und die 
Optionen waren sonst unverändert.

Vielen Dank trotzdem für eure Hilfe!

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

In dem Falle ist das Ergebnis abhängig vom Makefile selbst. Ist diese 
Abhängigkeit beschrieben? Ansonsten ist erst ein "make clean" o.ä. 
erforderlich.

von 3333 (Gast)


Lesenswert?

Johann L. schrieb:
> In dem Falle ist das Ergebnis abhängig vom Makefile selbst. Ist diese
> Abhängigkeit beschrieben?
Wie meinst du das?

make clean habe ich grundsätzlich nach allen Änderungen ausgeführt. Ich 
halte es für unwahrscheinlich, dass mein Problem damit zu tun hatte.

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.